JavaScript中Map用扩展运算符...转为数组得到的是二维数组,每个元素为[key, value];只取键或值需先调用keys()或values();转对象应使用Object.fromEntries()。

JavaScript 中 Map 可以直接用扩展运算符 ... 转成数组,但结果不是简单的一维数组,而是由键值对组成的二维数组(每个元素是 [key, value] 的数组)。
Map 转为二维数组(最常用)
Map 的迭代器默认按 [key, value] 形式返回每一项,所以展开后得到的是二维数组:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]); const arr = [...map]; console.log(arr); // [['a', 1], ['b', 2], ['c', 3]]
- 这是最自然、最常用的转换方式,保留了 Map 的插入顺序
- 适合后续用
map()、filter()等处理键值对 - 注意:不能直接解构为一维数组(比如
[...map]不等于[1, 2, 3])
只取键或只取值
如果只需要键或值,先用 map.keys() 或 map.values() 获取对应迭代器,再展开:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]); const keys = [...map.keys()]; // ['a', 'b', 'c'] const values = [...map.values()]; // [1, 2, 3]
-
map.keys()和map.values()返回可迭代对象,支持扩展运算符 - 比手动遍历更简洁,且性能好
转为对象(需额外处理)
扩展运算符本身不能把 Map 直接变成普通对象,但可以结合 Object.fromEntries():
立即学习“Java免费学习笔记(深入)”;
const map = new Map([['a', 1], ['b', 2]]);
const obj = Object.fromEntries(map); // { a: 1, b: 2 }
-
Object.fromEntries()接收一个可迭代对象(如 Map 或二维数组),生成对象 - 这是目前最标准、兼容性良好的方式(ES2019+)
- 不推荐用
JSON.stringify+JSON.parse或循环拼对象,既低效又易出错
注意事项
Map 是有序集合,扩展运算符展开时严格保持插入顺序;但若想转成其他结构(如 Set、字符串等),需明确目标再选择方法:
- 避免误写
[...map].flat()想提取所有值——这会把['a', 1, 'b', 2]拼在一起,丢失键值关系 - Map 中的键可以是任意类型(包括对象、函数),展开后仍保留原类型,不会自动转成字符串
- 空 Map 展开后是空数组:
[...new Map()] → []


















