两个新集合类型:Set 是"不会重复的数组"(去重神器),Map 是"键可以是任何类型"的对象。
Set 就像数组,但里面的元素不会重复,重复的加不进去,自动帮你去掉。
| 以前 · 循环去重 | 现在 · 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(数组) 一过,重复的自动没了;再用 [... ] 把它变回数组。
let s = new Set();
s.add("大哥"); // 添加
s.add("二哥");
s.add("大哥"); // 重复的,加不进去
s.size; // 2(个数)
s.has("大哥"); // true(有没有)
s.delete("二哥"); // 删除 → true
s.clear(); // 清空所有
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 就像一个"加强版对象"。普通对象的键只能是字符串,Map 的键可以是数字、对象、数组,什么都能当键。
| 以前 · 普通对象 | 现在 · 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 的键保持原样,还能用对象当键。
let m = new Map();
m.set("name", "大喇叭"); // 添加 / 修改
m.get("name"); // 取值 → 大喇叭
m.has("name"); // 有没有 → true
m.delete("name"); // 删除 → true
m.size; // 个数
m.clear(); // 清空所有
| 对比项 | 普通对象 | Map |
|---|---|---|
| 键的类型 | 只能字符串 / 符号 | 任意类型 |
| 遍历 | for...in 比较绕 | 直接 forEach,按插入顺序 |
| 常用场景 | 固定字段的数据 | 动态增删的键值对 |