ECMAScript 6 新增的 Set 是一种新集合类型,为这门语言带来集合数据结构。
const s1 = new Set();
const s2 = new Set(["val1", "val2", "val3"]);
const s3 = new Set({
[Symbol.iterator]: function*() {
yield "val1";
yield "val2";
yield "val3";
}
});
console.log(s1.has("Matt")); // false
console.log(s1.add("Matt")); // [object Set]
console.log(s1.size); // 1
console.log(s1.delete("Matt")); // true
s2.forEach((val, dupVal) => console.log(`${val} -> ${dupVal}`)); // val1 -> val1 val2 -> val2 val3 -> val3
for (let value of s2[Symbol.iterator]()) {
console.log(value); // val1 val2 val3
}
可以自定义API
因为set可以保证插入顺序,不支持value重复
class XSet extends Set {
union(...sets) {
return XSet.union(this, ...sets)
}
intersection(...sets) {
return XSet.intersection(this, ...sets);
}
difference(set) {
return XSet.difference(this, set);
}
// 返回两个或更多集合的并集
static union(a, ...bSets) {
const unionSet = new XSet(a);
for (const b of bSets) {
for (const bValue of b) {
unionSet.add(bValue);
}
}
return unionSet;
}
// 返回两个或更多集合的交集
static intersection(a, ...bSets) {
const intersectionSet = new XSet(a);
for (const aValue of intersectionSet) {
for (const b of bSets) {
if (!b.has(aValue)) {
intersectionSet.delete(aValue);
}
}
}
return intersectionSet;
}
// 返回两个集合的差集
static difference(a, b) {
const differenceSet = new XSet(a);
for (const bValue of b) {
if (a.has(bValue)) {
differenceSet.delete(bValue);
}
}
return differenceSet;
}
}
let xset = new XSet();
let sss = xset.union([2,1,3],[1,2,4],[5,6,7]);
for (let value of sss[Symbol.iterator]()) {
console.log(value); // 2 1 3 4
}