JavaScript 中的 Set
是一种特殊的类型,它允许你存储唯一的值,无论是原始值或者是对象引用。Set
对象保存值的唯一性是通过使用其内部算法,在添加新元素时比较它们来实现的。
Set
中的每个元素只能出现一次。Set
中的元素没有特定的顺序。for...of
循环遍历 Set
。Set
内部优化了成员检测的性能。add
方法可以轻松地向集合中添加元素。// 创建一个新的 Set
let mySet = new Set();
// 添加元素
mySet.add(1); // Set { 1 }
mySet.add(2); // Set { 1, 2 }
mySet.add(1); // 重复的值不会被添加,结果仍然是 Set { 1, 2 }
// 检查元素是否存在
console.log(mySet.has(1)); // true
console.log(mySet.has(3)); // false
// 删除元素
mySet.delete(1); // 返回 true,现在集合是 Set { 2 }
// 获取集合的大小
console.log(mySet.size); // 1
// 清空集合
mySet.clear(); // 集合现在是空的
问题:尝试向 Set
中添加复杂对象时,即使两个对象的内容相同,它们也被视为不同的元素。
原因:Set
判断唯一性的依据是引用地址,而不是对象的内容。
解决方法:在添加对象之前,可以自定义一个比较函数来决定两个对象是否相等,或者使用 Map
结构,将对象的某个唯一属性作为键。
// 使用 Map 来处理对象内容的唯一性
let myMap = new Map();
function addObject(map, obj) {
// 假设每个对象都有一个唯一的 id 属性
if (!map.has(obj.id)) {
map.set(obj.id, obj);
}
}
let obj1 = { id: 1, name: 'Alice' };
let obj2 = { id: 2, name: 'Bob' };
let obj3 = { id: 1, name: 'Alice' }; // 内容与 obj1 相同,但 id 不同
addObject(myMap, obj1);
addObject(myMap, obj2);
addObject(myMap, obj3);
console.log(myMap.size); // 输出 2,因为 obj3 的 id 与 obj1 相同,所以没有被添加
通过这种方式,可以确保即使对象的内容相同,只要它们的唯一标识不同,就可以被添加到集合中。
领取专属 10元无门槛券
手把手带您无忧上云