JS中对象转Map需用Object.entries()提取键值对,数组转Set直接传入构造函数即可去重,转Map则需明确键值映射规则,如嵌套数组、索引为键或自定义字段组合。

JS 中将普通对象或数组转为 Map 或 Set,关键在于理解它们的构造规则和数据结构特点:对象适合转 Map(保留键值对),数组适合转 Set(去重)或配合 Map 构造函数生成键值对。
把对象转成 Map
对象本身是键值对集合,但原生不支持直接用 new Map(obj)。需先提取键值对,再传入 Map 构造函数。推荐用 Object.entries():
const obj = { a: 1, b: 2, c: 3 };
const map = new Map(Object.entries(obj));
// Map(3) { 'a' => 1, 'b' => 2, 'c' => 3 }
注意:Object.entries() 只遍历自身可枚举属性,不处理原型链、Symbol 键或不可枚举属性。如有特殊需求,可手动遍历 Reflect.ownKeys() 并过滤。
把数组转成 Set
数组转 Set 最简单——直接传入构造函数,自动去重:
const arr = [1, 2, 2, 3, 3, 4];
const set = new Set(arr);
// Set(4) { 1, 2, 3, 4 }
若想保留原始顺序且只去重,这就是标准做法。无需额外处理。
把数组转成 Map
数组本身是一维结构,要转 Map 需明确“键”和“值”怎么取。常见方式有:
- 每项是
[key, value]二元数组(即“嵌套数组”):直接传给Map构造函数 - 用索引作键、元素作值:用
arr.map((v, i) => [i, v])转成键值对数组后再构造 - 自定义逻辑(如对象数组):用
map()提取字段组合成[key, value]
// 情况1:嵌套数组
const arr1 = [['x', 10], ['y', 20]];
const map1 = new Map(arr1); // Map(2) { 'x' => 10, 'y' => 20 }
// 情况2:索引为键
const arr2 = ['a', 'b', 'c'];
const map2 = new Map(arr2.map((v, i) => [i, v]));
// Map(3) { 0 => 'a', 1 => 'b', 2 => 'c' }
// 情况3:对象数组 → 用 id 作键,整个对象作值
const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
const userMap = new Map(users.map(u => [u.id, u]));
注意事项和边界情况
类型安全:Map 和 Set 的键/值可以是任意类型,但用对象或数组作键时要注意引用相等性(不是深比较)。
空值处理:空数组 [] 转 Set 得空 Set;空对象 {} 经 Object.entries() 得空数组,转 Map 也是空 Map。
性能提示:大数据量时,避免多次调用 set(),优先用构造函数一次性初始化。











