JavaScript 对象有没有类似数组 map 的方法
JavaScript 对象没有原生 map 方法,但可用 Object.keys/entries 配合数组 map 转换,再用 Object.fromEntries 组装回对象。Node 10+ 与现代浏览器均支持该写法。
对象本身没有 .map() 方法(那是数组的),但用 Object.keys() 或 Object.entries() 把对象转成数组后就能 map,最后用 Object.fromEntries() 把结果组装回对象。这就是"对对象的每个值做变换"的标准写法。
标准写法
const obj = { a: 1, b: 2, c: 3 };
// 每个值乘以 10
const doubled = Object.fromEntries(
Object.entries(obj).map(([key, value]) => [key, value * 10])
);
// { a: 10, b: 20, c: 30 }
Object.entries(obj)→[['a',1],['b',2],['c',3]].map(([k, v]) => [k, v * 10])→ 变换每个键值对Object.fromEntries(...)→ 组装回新对象
只想要变换后的值数组
const values = Object.values(obj).map(v => v * 10); // [10, 20, 30]
同时改键名
const upper = Object.fromEntries(
Object.entries(obj).map(([k, v]) => [k.toUpperCase(), v])
);
// { A: 1, B: 2, C: 3 }
自己封装一个 mapObject
const mapObject = (obj, fn) =>
Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, fn(v, k)]));
mapObject(obj, v => v * 10);
常见问题(FAQ)
Q:Object.fromEntries 兼容性如何?
Node 12+ 和所有现代浏览器原生支持;更老环境可用 lodash 的 mapValues 或自行 reduce 实现。
Q:能直接用 for...in 循环改原对象吗?
可以,但会修改原对象。函数式写法生成新对象、不污染原数据,更适合 React 状态更新等需要不可变性的场景。
Q:Map 对象有 map 方法吗?
ES 的 Map 也没有 map/reduce,但它可迭代:[...myMap].map(([k,v]) => ...) 再 new Map(...) 转回。