object.entries()和object.fromentries()分别是es2017与es2019引入的对象与键值对数组互转方法:前者将对象转为[key,value]二维数组,后者将其还原为对象,支持map等可迭代结构,语义清晰、函数式风格强。

Object.entries() 和 Object.fromEntries() 是 ES2017 和 ES2019 引入的两个实用方法,它们分别用于将对象转为键值对数组、将键值对数组还原为对象,是对象与二维数组之间互转的最简洁方式。
Object.entries():对象 → 键值对数组
它接收一个对象,返回一个二维数组,每个子数组包含 [key, value],顺序与 for...in 一致(仅遍历自身可枚举属性)。
例如:
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.entries(obj));
// [['a', 1], ['b', 2], ['c', 3]]
注意:
- 不处理 Symbol 属性(除非显式定义在 Object.keys 的扩展中);
- 不包含原型链上的属性;
- key 始终为字符串(即使原对象用数字或 Symbol 作 key,也会被转为字符串,Symbol 会被忽略)。
Object.fromEntries():键值对数组 → 对象
它是 Object.entries() 的逆操作,接收一个可迭代对象(通常是二维数组),每个元素是长度为 2 的数组 [key, value],返回一个新对象。
例如:
const arr = [['x', 10], ['y', 20], ['z', 30]];
console.log(Object.fromEntries(arr));
// { x: 10, y: 20, z: 30 }
支持任意可迭代结构,比如 Map、filter 后的 entries、甚至生成器:
Object.fromEntries(new Map([['a', 1], ['b', 2]]))-
Object.fromEntries(Object.entries(obj).filter(([k]) => k !== 'b'))(过滤掉某个 key) - 可用于解构重命名:
Object.fromEntries(Object.entries(obj).map(([k, v]) => [k + 'Copy', v]))
典型互转场景与注意事项
二者配合使用,可实现干净的对象转换逻辑:
- 深拷贝简单对象:
Object.fromEntries(Object.entries(obj))(仅浅层) - 筛选属性:
Object.fromEntries(Object.entries(obj).filter(([k]) => k.startsWith('user'))) - 批量类型转换:
Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, Number(v)])) - 注意空值:若数组中某项不是二元数组(如
['a']或['a', 1, 2]),会静默截断或报错(取决于环境,建议校验) - 重复 key 时,后出现的会覆盖前面的:
Object.fromEntries([['a', 1], ['a', 2]]) → { a: 2 }
与 Object.keys / Object.values / for...in 的区别
相比传统方式:
-
Object.entries()比Object.keys().map(k => [k, obj[k]])更直接、语义清晰; -
Object.fromEntries()比arr.reduce((o, [k,v]) => (o[k]=v, o), {})更易读且专一; - 不依赖 for 循环或 reduce,函数式风格更强;
- 天然兼容 Map → Object 转换(Map 实例本身是可迭代的)。










