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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:27:03