JavaScript不使用Object.keys()遍历对象数组统计键出现次数的方法
现有代码的可优化点
- 替换数组遍历方式:不要使用
for-in遍历数组,for-in的设计目的是遍历普通对象的可枚举属性,用到数组上时会把数组原型链上的自定义可枚举属性也遍历到,容易出现非预期的遍历项导致计数错误。更稳妥的基础方案可以用普通for循环,或者可读性更高的for-of循环直接遍历数组元素。 - 修正键存在的判断逻辑:你当前用
test[str] !== undefined判断键是否存在有边界问题:如果对象本身就存在该键,但对应的值恰好是undefined,这个判断会误判为键不存在。推荐使用hasOwnProperty判断对象自身是否包含指定键,不会受键对应值的影响。
优化后的基础实现示例
function countTimesOfKey(arr, str) { let count = 0 // 用for-of直接遍历数组的每个元素,不需要手动拿索引取值 for (const obj of arr) { // 用call调用原型上的hasOwnProperty,避免对象重写该方法导致的异常 if (Object.prototype.hasOwnProperty.call(obj, str)) { count++ } } return count }
如果你的使用场景里不会出现重写hasOwnProperty的特殊对象,判断条件可以简化为obj.hasOwnProperty(str);如果需求允许统计继承自原型链的键,还可以进一步简化为str in obj。
更简洁的简化实现
你也可以用数组基础方法reduce实现,不需要手动维护计数变量,代码更简洁,且完全符合你不使用Object.keys和正则的要求:
function countTimesOfKey(arr, str) { return arr.reduce((total, obj) => total + (Object.prototype.hasOwnProperty.call(obj, str) ? 1 : 0) , 0) }
内容的提问来源于stack exchange,提问作者deepveeneck
相关产品推荐
相关产品推荐

