集合
/* 概念: 集合是由一组无序且唯一(即不能重复)的项组成的; 方法: add(element):向集合添加一个新元素。 delete(element):从集合移除一个元素。 has(element):如果元素在集合中,返回 true,否则返回 false。 clear():移除集合中的所有元素。 size():返回集合所包含元素的数量。它与数组的 length 属性类似。 values():返回一个包含集合中所有值(元素)的数组。 */ class Set { constructor() { this.items = {}; } has(element) { /* Object 原型有 hasOwnProperty 方法。该方法返回一个表明对象是否具有特定属性的布尔 值。in 运算符则返回表示对象在原型链上是否有特定属性的布尔值。 */ // return element in items; return Object.prototype.hasOwnProperty.call(this.items, element); } add(element) { if(!this.has(element)) { this.items[element] = element; return true; } return false; } delete(element) { if (this.has(element)) { delete this.items[element]; return true; } return false; } clear() { this.items = {}; } size() { return Object.keys(this.items).length; } sizeLegacy() { let count = 0; for (let key in this.items) { /* 还需要使用 has 方法(以验证 items 对象具有该属性),因为对象的原 型包含了额外的属性(属性既有继承自 JavaScript 的 Object 类的,也有属于对 象自身、未用于数据结构的) */ if (this.items.hasOwnProperty(key)) { count++; } } return count; } values() { /* Object.values()方法返回了一个包含给定对象所有属性值的数组。它是在 ECMAScript 2017 中被添加进来的,目前只在现代浏览器中可用 */ return Object.values(this.items); } valuesLegacy() { let values = []; for (let key in this.items) { if (this.items.hasOwnProperty(key)) { values.push(key); } } return values; } // 并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。 union(otherSet) { const unionSet = new Set(); this.values().forEach(value => unionSet.add(value)); otherSet.values().forEach(value => unionSet.add(value)); return unionSet; } // 交集:包含两个集合中共有元素的新集合 intersection(otherSet) { const intersectionSet = new Set(); const values = this.values; for (let i = 0; i < values.length; i++) { if(otherSet.has(valuesp[i])) { intersectionSet.add(values[i]) } } return intersectionSet; } // 优化代码--迭代元素的次数更少--意味着更少的过程消耗 intersectionTwo(otherSet) { const intersectionSet = new Set(); const values = this.values(); const otherValues = otherSet.values(); let biggerSet = values; let smallerSet = otherValues; if(otherValues.length - values.length > 0) { biggerSet = otherValues; smallerSet = values; } smallerSet.forEach(value => { if(biggerSet.includes(value)) { intersectionSet.add(value) } }); return intersectionSet; } // 差集:包含所有存在于第一个集合且不存在于第二个集合的元素的新集合(所有存在于集合 A 但不存在于集合 B 的元素) difference(otherSet) { const differenceSet = new Set(); this.values().forEach(value => { if(!otherSet.has(value)){ differenceSet.add(value); } }); return differenceSet; } // 子集::验证一个给定集合是否是另一集合的子集 isSubsetOf(otherSet) { if (this.size() > otherSet.size()) { return false; } /* 只要回调函数返回 true,every 方法就会被调用。如果 回调函数返回 false,循环会停止 */ let isSubset = true; this.values().every(value => { if (!otherSet.has(value)) { isSubset = false; return false; } return true; }); return isSubset; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?