长话简说JavaScript(6)Set详细解读

本文介绍了ECMAScript6中新增的Set数据结构,展示了其不重复值的特性以及如何使用add、delete方法进行操作。通过示例,详细解释了如何自定义集合操作如并集、交集和差集,提供了类XSet的实现,并通过实例演示了这些操作的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听不见你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值