JavaScript ES6 引入了两个新的数据结构,即 Set
和 WeakSet
。
Set类似于数组,它允许无涯教程存储数字,字符串,对象等多个项目。但是,与数组不同,Set不能包含重复值。
要创建Set
,您需要使用 new Set()
构造函数。例如,
// 创建集合
const set1 = new Set();//an empty set
console.log(set1);//Set {}
// 设置多种类型的值
const set2 = new Set([1, 'hello', {count : true}]);
console.log(set2);//Set {1, "hello", {count: true}}
将重复值传递给 Set
对象时,将排除重复值。
// 设置重复值
const set3 = new Set([1, 1, 2, 2]);
console.log(set3);//Set {1, 2}
您可以使用 values()
方法访问 Set
元素,并使用has()
检查 Set
中是否有元素。例如,
const set1 = new Set([1, 2, 3]);
// 访问 Set 的元素
console.log(set1.values());//Set Iterator [1, 2, 3]
您可以使用 has()
方法检查元素是否在Set中。例如,
const set1 = new Set([1, 2, 3]);
// 检查元素是否在 Set 中
console.log(set1.has(1));
您可以使用 add()
方法将元素添加到Set中。例如,
const set = new Set([1, 2]);
console.log(set.values());
// 添加新元素
set.add(3);
console.log(set.values());
// 添加重复元素
// 不添加到 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]
// 删除特定元素
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]
// 删除 Set 的所有元素
set.clear();
console.log(set.values());//Set Iterator []
您可以使用 for ... of 循环或forEach()方法。元素按插入顺序进行访问。例如,
const set = new Set([1, 2, 3]);
// looping through Set
for (let i of set) {
console.log(i);
}
输出
1 2 3
WeakSet与Set类似。但是,WeakSet只能包含对象,而Set可以包含任何数据类型,例如字符串,数字,对象等。例如,
const weakSet = new WeakSet();
console.log(weakSet);//WeakSet {}
let obj = {
message: 'Hi',
sendMessage: true
}
// 将对象(元素)添加到 WeakSet
weakSet.add(obj);
console.log(weakSet);//WeakSet {{message: "Hi", sendMessage: true}}
当您尝试添加除对象之外的其他数据类型时,WeakSet会引发错误。例如,
// 试图将字符串添加到 WeakSet
weakSet.add('hello');
// throws error
// TypeError: Attempted to add a non-object key to a WeakSet
console.log(weakSet);
WeakSet具有方法 add()
, delete()
和 has()
。例如,
const weakSet = new WeakSet();
console.log(weakSet);//WeakSet {}
const obj = {a:1};
// 添加到WeakSet
weakSet.add(obj);
console.log(weakSet);//WeakSet {{a: 1}}
// 检查元素是否在 Set 中
console.log(weakSet.has(obj));//true
// 删除元素
weakSet.delete(obj);
console.log(weakSet);//WeakSet {}
与Sets不同,WeakSets是不可迭代的。例如,
const weakSet = new WeakSet({a:1});
// 循环通过 WeakSet
for (let i of weakSet) {
//TypeError
console.log(i);
}
在JavaScript中,Set不提供用于执行数学运算(例如并集,交集,差等)的内置方法。但是,无涯教程可以创建程序来执行这些运算。
// 执行union操作
// 包含两个集合的元素
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"}
// 执行交叉操作
// 集合 a 中也在集合 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"}
// 进行差分运算
//集合 a 中不在集合 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"}
// 执行子集操作
// 如果集合 b 的所有元素都在集合 a 中,则为 true
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 Set 支持和 JavaScript WeakSet支持。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
Tony Bai · Go语言第一课 -〔Tony Bai〕