You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用findIndex统计字符串数组频率时遇‘term未定义’错误求排查

问题定位与解决

报错term未定义的核心原因是你在findIndex的回调函数里引用了未声明的变量term——你应该用当前遍历到的数组元素去匹配termsArr中对象的term属性。

错误代码示例(推测你的问题代码)

let strArr = ["Apple", "Orange", "Banana", "Apple", "Pear", "Banana"];
let termsArr = [];

strArr.forEach(function() {
  // 错误使用未定义的`term`变量
  const existingIndex = termsArr.findIndex(obj => obj.term === term);
  if (existingIndex !== -1) {
    termsArr[existingIndex].frequency++;
  } else {
    termsArr.push({ term: term, frequency: 1 });
  }
});

修正后的代码

let strArr = ["Apple", "Orange", "Banana", "Apple", "Pear", "Banana"];
let termsArr = [];

strArr.forEach(item => {
  // 用当前遍历的item匹配已有对象的term属性
  const existingIndex = termsArr.findIndex(obj => obj.term === item);
  if (existingIndex !== -1) {
    // 找到重复项,更新频率
    termsArr[existingIndex].frequency++;
  } else {
    // 无匹配项,添加新对象
    termsArr.push({ term: item, frequency: 1 });
  }
});

console.log(termsArr);

输出结果

[
  { term: 'Apple', frequency: 2 },
  { term: 'Orange', frequency: 1 },
  { term: 'Banana', frequency: 2 },
  { term: 'Pear', frequency: 1 }
]

额外优化方案(用Map提升效率)

如果数组元素较多,用Map统计频率会比findIndex更高效(findIndex每次遍历为O(n)复杂度,Map查找为O(1)):

let strArr = ["Apple", "Orange", "Banana", "Apple", "Pear", "Banana"];
const frequencyMap = new Map();

// 先统计所有元素的频率
strArr.forEach(item => {
  frequencyMap.set(item, (frequencyMap.get(item) || 0) + 1);
});

// 转换为目标数组格式
const termsArr = Array.from(frequencyMap, ([term, frequency]) => ({ term, frequency }));

console.log(termsArr);

内容的提问来源于stack exchange,提问作者MeltingDog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:44:18