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(...) 转回。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台