object.fromentries()是es2019引入的静态方法,用于将map或二维数组等可迭代键值对一次性转为普通对象,支持urlsearchparams、filter/map动态处理,并与object.entries()配合实现对象与map互转,现代环境原生支持。
object.fromentries() 是 es2019 引入的静态方法,专门用于把可迭代的键值对结构(如 map 或二维数组)**一次性转成普通对象**,写法简洁、语义清晰,比手写循环或 reduce 更直观高效。
直接转换 Map 实例
Map 本身是可迭代的,每次迭代返回 [key, value] 数组,正好符合 fromEntries 的输入要求:
const map = new Map([
['name', 'Alice'],
['age', 30],
['active', true]
]);
const obj = Object.fromEntries(map);
// { name: 'Alice', age: 30, active: true }
注意:Map 中的 key 可以是任意类型(包括对象、函数),但转成对象后,**所有 key 都会被强制转为字符串**(因为普通对象的属性名只能是字符串或 Symbol)。如果原始 Map 的 key 是对象,会变成 "[object Object]",造成覆盖 —— 这不是 bug,而是语言限制,使用前需确认 key 类型是否适合。
还原键值对二维数组
只要数组元素是长度为 2 的子数组(即 [key, value] 形式),就能直接传入:
- 普通字面量数组:
Object.fromEntries([['a', 1], ['b', 2]]) → { a: 1, b: 2 } - 从 URLSearchParams 获取:
Object.fromEntries(new URLSearchParams('x=1&y=2')) → { x: '1', y: '2' }(值始终是字符串) - 配合
filter或map动态生成:Object.fromEntries(entries.filter(([k]) => k.startsWith('data-')))
和 Object.entries() 搭配实现“对象 ↔ Map”互转
这是常见组合用法,双向转换干净无损(前提是对象 key 全为字符串或 Symbol):
// 对象 → Map
const map = new Map(Object.entries({ a: 1, b: 2 }));
// Map → 对象(还原)
const obj = Object.fromEntries(map);
// 对象 → 对象(筛选后还原)
const filtered = Object.fromEntries(
Object.entries(original).filter(([k, v]) => typeof v === 'string')
);
相比 for...of 或 Array.reduce(),这种写法更声明式,逻辑聚焦在“要什么”,而不是“怎么循环赋值”。
兼容性与替代方案
现代浏览器和 Node.js 12+ 原生支持。若需兼容旧环境,可用 polyfill 或退化写法:
- Polyfill:导入
core-js/stable/object/from-entries - 简易降级:
Object.assign(...arr.map(([k, v]) => ({ [k]: v })))(仅适用于 key 为字符串/合法标识符,且无重复 key) - 稳妥降级:
arr.reduce((acc, [k, v]) => (acc[k] = v, acc), {})
不过在绝大多数新项目中,直接用 Object.fromEntries() 即可,清晰又可靠。











