← 返回目录

Set 和 Map

两个新集合类型:Set 是"不会重复的数组"(去重神器),Map 是"键可以是任何类型"的对象。

一、Set

1. Set 是什么

Set 就像数组,但里面的元素不会重复,重复的加不进去,自动帮你去掉。

2. 以前去重要写循环,现在一行

以前 · 循环去重 现在 · new Set
let arr = [1, 2, 3, 4, 4, 3];
let unique = [];
arr.forEach(x => {
  if (unique.indexOf(x) === -1) {
    unique.push(x);
  }
});
console.log(unique);   // [1,2,3,4]
let arr = [1, 2, 3, 4, 4, 3];
let unique = [...new Set(arr)];
console.log(unique);   // [1,2,3,4]

new Set(数组) 一过,重复的自动没了;再用 [... ] 把它变回数组。

3. Set 的常用方法

let s = new Set();
s.add("大哥");      // 添加
s.add("二哥");
s.add("大哥");      // 重复的,加不进去
s.size;             // 2(个数)
s.has("大哥");      // true(有没有)
s.delete("二哥");   // 删除 → true
s.clear();          // 清空所有
	

4. 用处:交集、并集

let a = [1, 2, 3, 4];
let b = [3, 4, 5, 6];

// 交集:a 和 b 都有的
let inter = [...new Set(a)].filter(x => new Set(b).has(x));
console.log(inter);   // [3,4]

// 并集:所有值,去重
let union = [...new Set([...a, ...b])];
console.log(union);   // [1,2,3,4,5,6]
	

二、Map

1. Map 是什么

Map 就像一个"加强版对象"。普通对象的键只能是字符串,Map 的键可以是数字、对象、数组,什么都能当键。

2. 对比普通对象

以前 · 普通对象 现在 · Map
let obj = {};
obj[123] = "数字键";
console.log(obj);
// {"123": "数字键"}
// 键被强制转成字符串了!
let m = new Map();
m.set(123, "数字键");          // 数字键
m.set({ id: 1 }, "对象键");    // 对象键
console.log(m.get(123));
// 数字键(键保持原样)

普通对象的键会被强制转成字符串(123 变成 "123");Map 的键保持原样,还能用对象当键。

3. Map 的常用方法

let m = new Map();
m.set("name", "大喇叭");   // 添加 / 修改
m.get("name");             // 取值 → 大喇叭
m.has("name");             // 有没有 → true
m.delete("name");          // 删除 → true
m.size;                    // 个数
m.clear();                 // 清空所有
	

4. 普通对象 vs Map 对比

对比项 普通对象 Map
键的类型 只能字符串 / 符号 任意类型
遍历 for...in 比较绕 直接 forEach,按插入顺序
常用场景 固定字段的数据 动态增删的键值对
一句话:Set 管"不重复",Map 管"任意键"