Object.entries() 将对象转为键值对数组,支持解构、高阶函数链式处理,天然规避原型污染,配合 Object.fromEntries 实现对象与数组双向转换,但仅处理自身可枚举字符串键。

Object.entries() 不只是把对象转成二维数组,它在对象迭代中能实现更灵活、更函数式的操作,尤其适合配合解构、高阶函数和链式处理。
用解构快速提取键值对
遍历对象时,直接解构 Object.entries() 的每一项,比传统 for...in 或 Object.keys() + 索引取值更简洁安全:
- 避免原型链污染(
hasOwnProperty检查可省略) - 天然支持同时访问 key 和 value,无需重复查属性
- 适合配合
map、filter等做数据转换
例如筛选并格式化非空字符串值:
const obj = { a: 'hello', b: '', c: 'world', d: 0 };const validPairs = Object.entries(obj)
.filter(([, v]) => typeof v === 'string' && v.trim())
.map(([k, v]) => `${k}: "${v}"`);
// → ['a: "hello"', 'c: "world"']
结合 reduce 实现对象结构转换
利用 Object.entries() + reduce(),可轻松完成对象映射、类型转换、嵌套扁平化等任务:
立即学习“Java免费学习笔记(深入)”;
- 把原对象的 value 统一转为字符串:
Object.entries(obj).reduce((acc, [k, v]) => ({ ...acc, [k]: String(v) }), {}) - 反转键值(仅限字符串/数字 key):
Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k])) - 按条件合并多个对象字段:
Object.fromEntries(Object.entries(obj).filter(...))
注意:频繁用展开运算符({...acc, [k]: v})在大数据量时有性能损耗,可改用 Object.assign(acc, { [k]: v }) 或初始化空对象后赋值。
与 Object.fromEntries 配合实现双向转换
Object.entries() 和 Object.fromEntries() 是互逆操作,构成“对象 ↔ 键值数组”的闭环,是函数式编程中常用模式:
- 清洗对象:先转数组 → 过滤/排序/修改 → 再转回对象
- 排序后重建对象(ES2015+ 保证对象属性顺序,但仅限插入顺序;
Object.fromEntries()严格按数组顺序生成) - 将 Map 转为对象:
Object.fromEntries(myMap)(因为 Map 可直接被fromEntries接收)
例如按 value 升序重排对象属性:
const sortedObj = Object.fromEntries(Object.entries(obj).sort(([, a], [, b]) => a - b)
);
处理嵌套对象与 Symbol/不可枚举属性的注意事项
Object.entries() 只返回对象**自身、可枚举、字符串键**的属性,不包含:
- Symbol 类型的键(需用
Object.getOwnPropertySymbols()单独处理) - 不可枚举属性(如
Object.defineProperty(obj, 'hidden', { enumerable: false })) - 原型链上的属性(这是优点,不是缺陷)
- undefined 或 null 值的键(但键本身仍会被列出)
若需完整遍历,可组合使用:[...Object.entries(obj), ...Object.getOwnPropertySymbols(obj).map(sym => [sym, obj[sym]])],再统一处理。










