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
相关产品推荐
相关产品推荐

