- 集合是保存不重复数据的无序数据集
- 数据不重复
- 无序
采用对象的形式封装set
/*** 集合:没有重复数据的无序数据集** 1.add(element) 向集合中添加元素* 2.delete(element) 向集合中删除元素* 3.has(element) 判断是否包含某元素* 4.clear 清空集合* 5.size 集合元素数量* 6.values 返回一个包含集合中所有元素的数组*/class Set {constructor() {// 用对象存储数据this.items = {};}has(element) {// return element in this.itemsreturn Object.prototype.hasOwnProperty.call(this.items, element);}add(element) {if (this.has(element)) {return false;} else {this.items[element] = element;return true;}}delete(element) {if (this.has(element)) {return false;} else {delete this.items[element];return true;}}clear() {this.items = {};}size() {return Object.keys(this.items).length;}values() {// const arr = [];// for (let key in this.items) {// arr.push(this.items[key]);// }// return arr;// 使用Object.values方法 -- 返回value值组成的数组return Object.values(this.items);}}
集合运算
并集
- 对于给定的两个集合,返回一个包含两个几个中所有元素的集合
union(otherSet) {const newSet = new Set();// 1.遍历当前集合,插入到新的集合中this.values().forEach((item) => newSet.add(item));// 2.遍历参数集合,插入到新的集合otherSet.values().forEach((item) => newSet.add(item));return newSet;}
交集
- 对于给定的两个集合,返回一个包含两个集合共有元素的新集合
代码优化:通过判断哪个集合元素更少,遍历较少元素的集合
intersection(otherSet) {const newSet = new Set();// 通过function - has判断是否两个几个都包含该元素this.values().forEach((item) => {if (otherSet.has(item)) {newSet.add(item);}});return newSet;}intersection(otherSet) {let newSet = new Set();let diffSet1 =this.values().length > otherSet.values().length ? otherSet : this;let diffSet2 =this.values().length < otherSet.values().length ? otherSet : this;diffSet1.values().forEach((item) => {if (diffSet2.has(item)) {newSet.add(item);}});return newSet;}
差集
- 对于给定的两个集合,返回一个A集合有但是B集合没有的集合 - 交集的判断反过来即可
diff(otherSet) {const newSet = new Set();this.values().forEach((item) => {// A有B无if (!otherSet.has(item)) {newSet.add(item);}});return newSet;}
子集
判断一个集合是否为该集合的子集
sub(subSet) {if (subSet.values().length > this.values().length) {return false;}// 参数集合中的每个元素都能在父集合中找到let right = true;subSet.values().forEach((item) => {if (!this.has(item)) {right = false;}});return right;}
原生set方法
- 与封装不同的是,打印set 结果是一对花括号包裹一个字符序列
- function
- add:添加元素
- delete:删除元素
- size:集合元素数量
- clear:清空集合
- has:判断是否包含该元素
- values:返回迭代器
- 原生set可以直接使用数组的遍历方法forEach
- new Set接收数组作为参数
扩展运算符+set:去除数组重复元素
- set需要传入数组作为参数
let arr = [1, 2, 3, 3, 3, 4, 5, 2, 1, 3, 4];arr = [...new Set(arr)];console.log(arr);console.log(...arr);console.log([...arr]);
