
本文详解如何正确统计字符串数组中各元素的出现次数,并构建 { term, frequency } 格式的对象数组;重点修正 findIndex 使用中的逻辑错误(如索引判断偏差、数组越界赋值),并提供更简洁可靠的替代方案。
本文详解如何正确统计字符串数组中各元素的出现次数,并构建 `{ term, frequency }` 格式的对象数组;重点修正 `findindex` 使用中的逻辑错误(如索引判断偏差、数组越界赋值),并提供更简洁可靠的替代方案。
在你的原始代码中,核心问题并非 term is not defined 的报错(该错误实际不会发生——因为 findIndex 回调中 obj.term 在空数组时根本不会执行),而是两个关键逻辑缺陷导致结果异常:
-
findIndex返回值判断错误:findIndex找不到匹配项时返回-1,而你写的是if (objIndex > 0)—— 这会忽略objIndex === 0的情况(即首个元素首次插入后,第二次遇到"Apple"时若它恰好位于索引0,条件不成立,反而走else分支,造成重复添加而非更新); -
错误使用
termsArr[i]赋值:else分支中termsArr[i] = { ... }会导致数组稀疏化或越界填充(例如第 3 次循环时i=2,但termsArr当前长度可能仍为 1),应统一使用push()。
✅ 正确使用 findIndex 的修复版如下:
let strArr = ["Apple", "Orange", "Banana", "Apple", "Pear", "Banana"];
let termsArr = [];
for (let i = 0; i < strArr.length; i++) {
const arrItem = strArr[i];
const objIndex = termsArr.findIndex(obj => obj.term === arrItem);
if (objIndex !== -1) {
// 找到匹配项:更新 frequency
termsArr[objIndex].frequency += 1;
} else {
// 未找到:新增对象(用 push 避免索引错位)
termsArr.push({ term: arrItem, frequency: 1 });
}
}
console.log(termsArr);
// [{term:"Apple",frequency:2}, {term:"Orange",frequency:1}, ...]⚠️ 注意事项:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 始终用
===替代==进行严格比较,避免类型隐式转换引发意外; -
findIndex返回-1表示未找到,不是> 0—— 判断必须是!== -1或>= 0; - 向数组添加新元素请始终使用
push(),而非按原数组索引termsArr[i]赋值。
? 更推荐的现代写法(语义清晰、性能优异、无副作用):
利用 reduce 一步聚合频次,再转为最终格式:
const strArr = ["Apple", "Orange", "Banana", "Apple", "Pear", "Banana"];
const termsArr = Object.entries(
strArr.reduce((acc, term) => {
acc[term] = (acc[term] || 0) + 1;
return acc;
}, {})
).map(([term, frequency]) => ({ term, frequency }));
console.log(termsArr);该方案时间复杂度为 O(n),且无需手动管理索引与条件分支,代码更健壮、易读、可维护。无论数据量大小,都是生产环境首选。
立即学习“Java免费学习笔记(深入)”;

















