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

JavaScript中统计多个关联数组中值出现次数的最优方法

在JavaScript中统计对象中指定值出现次数的最优方法

好问题!先纠正个小细节:你代码里的array1、array2其实是JavaScript对象(不是严格意义上的关联数组,不过日常开发里大家常这么称呼)。针对你给出的场景,我给你几个实用且高效的方案:

快速直观的基础解法

如果对象数量不多,直接把它们放进数组里遍历计数就很简单:

const obj1 = { firstname: 'john', lastname: 'bob' };
const obj2 = { firstname: 'sara', lastname: 'johnson' };
const obj3 = { firstname: 'john', lastname: 'paul' };

// 把所有对象整合到一个数组中
const userObjects = [obj1, obj2, obj3];

let johnCount = 0;
for (const user of userObjects) {
  // 可选:如果担心对象没有firstname键,可以加判断:user.firstname === 'john'
  if (user.firstname === 'john') {
    johnCount++;
  }
}

console.log(johnCount); // 输出:2

这个方法的优势是可读性极强,新手也能一眼看懂,而且是线性遍历O(n)的时间复杂度,性能拉满。

通用可复用的优雅写法

如果需要经常做这类统计,或者要适配不同的键和目标值,用reduce方法封装成通用函数会更高效:

function countValueOccurrences(objects, targetKey, targetValue) {
  return objects.reduce((total, currentObj) => {
    // 加个键存在的判断,避免不存在该键时的潜在问题
    return currentObj[targetKey] === targetValue ? total + 1 : total;
  }, 0);
}

// 调用示例
const userObjects = [obj1, obj2, obj3];
const johnCount = countValueOccurrences(userObjects, 'firstname', 'john');
console.log(johnCount); // 输出:2

用reduce的好处是代码更简洁,而且这个函数可以重复使用——比如你之后要统计lastname为johnson的次数,只需要换参数就行,不用重复写遍历逻辑。

关于“最优”的考量

其实上面两种方法的时间复杂度都是O(n),对于大多数日常场景来说没有性能差异:

  • 如果需要中途终止遍历(比如找到第2个目标值就停止),那用for...of配合break会比reduce更高效;
  • 如果追求代码简洁性和复用性,reduce的封装写法是更好的选择;
  • 如果对象可能缺失目标键,记得加上currentObj.hasOwnProperty(targetKey)或者targetKey in currentObj的判断,避免意外报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:25:25