JavaScript ES6 引入了两种新的数据结构,即 Set
和 WeakSet
。
Set 类似于一个 数组,可以存储多个项目,如 数字、字符串、对象 等。然而,与数组不同的是,set 不能包含重复的值。
创建 JavaScript Set
要创建一个 Set
,你需要使用 new Set()
构造函数。例如,
// create Set
const set1 = new Set(); // an empty set
console.log(set1); // Set {}
// Set with multiple types of value
const set2 = new Set([1, 'hello', {count : true}]);
console.log(set2); // Set {1, "hello", {count: true}}
当传递重复值给 Set
对象时,重复的值将被排除。
// Set with duplicate values
const set3 = new Set([1, 1, 2, 2]);
console.log(set3); // Set {1, 2}
访问 Set 元素
你可以使用 values()
方法访问 Set
元素,并使用 has()
方法检查 Set
中是否存在某个元素。例如,
const set1 = new Set([1, 2, 3]);
// access the elements of a Set
console.log(set1.values()); // Set Iterator [1, 2, 3]
你可以使用 has()
方法检查元素是否在 Set 中。例如,
const set1 = new Set([1, 2, 3]);
// check if an element is in Set
console.log(set1.has(1));
添加新元素
你可以使用 add()
方法向 Set 添加元素。例如,
const set = new Set([1, 2]);
console.log(set.values());
// adding new elements
set.add(3);
console.log(set.values());
// adding duplicate elements
// does not add to Set
set.add(1);
console.log(set.values());
输出
Set Iterator [1, 2] Set Iterator [1, 2, 3] Set Iterator [1, 2, 3]
删除元素
你可以使用 clear()
和 delete()
方法从 Set 中删除元素。
delete()
方法从 Set
中删除特定元素。例如,
const set = new Set([1, 2, 3]);
console.log(set.values()); // Set Iterator [1, 2, 3]
// removing a particular element
set.delete(2);
console.log(set.values()); // Set Iterator [1, 3]
clear()
方法从 Set
中删除所有元素。例如,
const set = new Set([1, 2, 3]);
console.log(set.values()); // Set Iterator [1, 2, 3]
// remove all elements of Set
set.clear();
console.log(set.values()); // Set Iterator []
迭代 Sets
你可以使用 for...of 循环或 forEach() 方法迭代 Set 元素。元素按插入顺序访问。例如,
const set = new Set([1, 2, 3]);
// looping through Set
for (let i of set) {
console.log(i);
}
输出
1 2 3
JavaScript WeakSet
WeakSet 类似于 Set。然而,WeakSet 只能包含对象,而 Set 可以包含任何数据类型,如字符串、数字、对象等。例如,
const weakSet = new WeakSet();
console.log(weakSet); // WeakSet {}
let obj = {
message: 'Hi',
sendMessage: true
}
// adding object (element) to WeakSet
weakSet.add(obj);
console.log(weakSet); // WeakSet {{message: "Hi", sendMessage: true}}
当你尝试添加对象以外的其他数据类型时,WeakSet 会抛出错误。例如,
// trying to add string to WeakSet
weakSet.add('hello');
// throws error
// TypeError: Attempted to add a non-object key to a WeakSet
console.log(weakSet);
WeakSet 方法
WeakSets 具有 add()
、delete()
和 has()
方法。例如,
const weakSet = new WeakSet();
console.log(weakSet); // WeakSet {}
const obj = {a:1};
// add to a weakSet
weakSet.add(obj);
console.log(weakSet); // WeakSet {{a: 1}}
// check if an element is in Set
console.log(weakSet.has(obj)); // true
// delete elements
weakSet.delete(obj);
console.log(weakSet); // WeakSet {}
WeakSets 不可迭代
与 Sets 不同,WeakSets 不可迭代。例如,
const weakSet = new WeakSet({a:1});
// looping through WeakSet
for (let i of weakSet) {
// TypeError
console.log(i);
}
数学集合运算
在 JavaScript 中,Set 不提供内置方法来执行并集、交集、差集等数学运算。但是,我们可以编写程序来执行这些运算。
示例:Set 并集运算
// perform union operation
// contain elements of both sets
function union(a, b) {
let unionSet = new Set(a);
for (let i of b) {
unionSet.add(i);
}
return unionSet
}
// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['grapes', 'apple', 'banana']);
let result = union(setA, setB);
console.log(result);
输出
Set {"apple", "mango", "orange", "grapes", "banana"}
示例:Set 交集运算
// perform intersection operation
// elements of set a that are also in set b
function intersection(setA, setB) {
let intersectionSet = new Set();
for (let i of setB) {
if (setA.has(i)) {
intersectionSet.add(i);
}
}
return intersectionSet;
}
// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['grapes', 'apple', 'banana']);
let result = intersection(setA, setB);
console.log(result);
输出
Set {"apple"}
示例:Set 差集运算
// perform difference operation
// elements of set a that are not in set b
function difference(setA, setB) {
let differenceSet = new Set(setA)
for (let i of setB) {
differenceSet.delete(i)
}
return differenceSet
}
// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['grapes', 'apple', 'banana']);
let result = difference(setA, setB);
console.log(result);
输出
Set {"mango", "orange"}
示例:Set 子集运算
// perform subset operation
// true if all elements of set b is in set a
function subset(setA, setB) {
for (let i of setB) {
if (!setA.has(i)) {
return false
}
}
return true
}
// two sets of fruits
let setA = new Set(['apple', 'mango', 'orange']);
let setB = new Set(['apple', 'orange']);
let result = subset(setA, setB);
console.log(result);
输出
true
JavaScript Sets
和 WeakSets
在 ES6 中引入。某些浏览器可能不支持它们。要了解更多信息,请访问 JavaScript Sets 支持 和 JavaScript WeakSets 支持。
另请阅读