最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何用 Object.keys 配合 forEach 快速遍历并统计对象属性
时间:2026-08-06 14:50:49 编辑:袖梨 来源:一聚教程网
如何用 Object.keys 配合 forEach 快速遍历并统计对象属性需要先看清适用场景和关键步骤,避免只记结论却忽略实际限制。
Object.keys返回键名数组,需配合for...of或forEach遍历键再取值;统计用length最简,分组或累加需forEach;修改原对象安全但需注意快照特性;Symbol和不可枚举属性被忽略。
Object.keys 遍历对象时为什么不能直接用 for...of?
Object.keys 返回的是一个数组,但它的元素是字符串(属性名),不是键值对。很多人误以为 for...of 能直接拿到值,结果写成:
for (const val of obj) { ... }——这会报错,因为对象不可迭代。必须先用 Object.keys 拿到键数组,再配合 forEach 或 for...of 遍历键,再通过 obj[key] 取值。统计属性数量、类型、长度的典型写法
用 Object.keys(obj).forEach 做统计,核心是维护一个外部变量或对象。常见需求有三类:
- 统计总数:直接用
Object.keys(obj).length更快,无需forEach - 按类型分组计数:比如统计 string / number / null 属性各有多少个
- 统计所有属性值的字符总长度(仅对 string 有效)
示例:统计 string 类型属性值的总长度
const obj = { a: 'hello', b: 123, c: 'world', d: null };let totalLen = 0;Object.keys(obj).forEach(key => { if (typeof obj[key] === 'string') { totalLen += obj[key].length; }});// totalLen === 10
forEach 里修改原对象安全吗?有没有副作用?
安全,但要注意两点:
-
forEach遍历的是键的快照,遍历过程中增删属性不影响当前循环顺序(新增键不会被访问,已删键访问时值为undefined) - 如果在回调里改了
obj[key],后续逻辑能立刻读到新值;但若依赖Object.keys的原始返回结果(比如提前存了键数组),则不受影响 - 不要在
forEach中用delete obj[key]同时又继续依赖该 key 的存在,容易出逻辑错
比 Object.keys + forEach 更合适的替代方案有哪些?
取决于你要做什么:
- 只统计数量 → 直接用
Object.keys(obj).length,不进循环 - 要同时处理 key 和 value → 改用
Object.entries(obj).forEach,避免重复查obj[key] - 需要过滤或映射 → 用
Object.keys(obj).filter(...).map(...)更函数式 - 兼容 IE8?
Object.keys不支持,得用for...in+hasOwnProperty替代
真正容易被忽略的是:Object.keys 不会返回 Symbol 属性或不可枚举属性。如果对象有 Object.defineProperty(obj, 'hidden', { enumerable: false }),它就完全不会出现在 Object.keys 结果里。
相关文章
- 鹅鸭杀超级金水铃模式怎么玩 08-07
- 牧场物语风之繁华集市生日日期怎么看 08-07
- 口袋新旅途如何捕捉颓颓鹰 08-07
- DNF狄瑞吉版本女漫游加点攻略 08-07
- 鹅鸭杀士兵怎么玩 08-07
- DNF狄瑞吉版本协战师加点攻略 08-07