class Set {
constructor() {
this.items = {};
}
}
复制代码
1. has() 检验某个元素是否存在于集合中javascript
has(element) {
return Object.prototype.hasOwnProperty.call(this.items, element); // 返回一个代表对象是否具备特定属性的布尔值
}
复制代码
2. add() 向集合添加一个新元素java
add(element) {
if (!this.has(element)) { // 检查
this.items[element] = element; // 若是不存在,就把element添加到集合中,返回true {element:element}
return true;
}
return false; // 若是集合中有相同的元素,返回false便可
}
复制代码
3. delete()从集合中删除一个元素算法
delete(element) {
if (this.has(element)) { // 检查,只能删除存在与集合中的,(集合中都没有,你删谁去~)
delete this.items[element]; // 从集合中移除element
return true; // 返回true
}
return false; // 若是集合中没有,返回false
}
复制代码
4. size()返回集合中有多少元素数组
size() { // 返回集合中有多少元素
return Object.keys(this.items).length; // 使用原生的内置方法,把对象的key转化为数组,再返回其length
}
复制代码
5. values()返回一个包含集合中全部全部值的数组浏览器
values() { // 返回一个包含集合中全部全部值的数组
return Object.values(this.items); // 一样使用原生方法(它是在ECMAscript2017中被添加进来的,目前只在如今浏览器中可用)
}
复制代码
1.并集 数据结构
union(otherSet) {
const unionSet = new Set(); // 建立一个新的集合
this.values().forEach(value => unionSet.add(value)); // 获取第一个集合(当前的set类实例)全部的值并添加到新集合中
otherSet.values().forEach(value => unionSet.add(value)); // 获取第二个集合(传入的set类实例)全部的值并添加到新集合中
return unionSet; // 最后返回建立的新集合
}
复制代码
2.交集 工具
intersection(otherSet) {
const intersectionSet = new Set(); // 建立一个新的集合
const values = this.values(); // 获取第一个集合(当前的set类实例)
const otherValues = otherSet.values(); // 获取第二个集合(传入的set类实例)
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; // 返回新集合
}
复制代码
3. 差集学习
difference(otherSet) {
const differenceSet = new Set(); // 建立一个新的集合
this.values().forEach(value => { // 当前集合的值转换为数组,并循环
if (!otherSet.has(value)) { // 若是传入的集合中没有这个元素
differenceSet.add(value); // 把它添加到新集合中
}
});
return differenceSet; // 返回新的集合
}
复制代码
4. 子集优化
isSubsetOf(otherSet) {
if (this.size() > otherSet.size()) { // 若是当前集合的元素比传入集合多,那它确定不是传入集合的子集,返回false
return false;
}
let isSubset = true; // 先假设当前集合是传入集合的子集
// 迭代当前集合,当发现一个返回false,便再也不执行。
this.values().every(value => {
if (!otherSet.has(value)) { // 验证迭代的元素是否也存在传入集合中
isSubset = false; // 只要有一个不是就改变变量
return false; // 返回false 再也不往下执行
}
return true; // 若是都是,返回true
});
return isSubset; // 最后返回变量isSubset
}
复制代码
const set = new Set();
set.add(1);
console.log(set.values()); // 输出@Iterator
console.log(set.has(1)); // 输出true
console.log(set.values()); // 输出1
复制代码
ES6Set运算模拟ui
const setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
const setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);
复制代码
const union = (set1, set2) => { // 普通模拟
const unionAb = new Set();
set1.forEach(value => unionAb.add(value));
set2.forEach(value => unionAb.add(value));
return unionAb;
};
console.log(union(setA, setB)); // [1,2,3,4]
console.log(new Set([...setA, ...setB])); // 使用 扩展运算符模拟 [1,2,3,4]
复制代码
const intersection = (set1, set2) => { // 普通模拟, 未经优化的
const intersectionSet = new Set();
set1.forEach(value => {
if (set2.has(value)) {
intersectionSet.add(value);
}
});
return intersectionSet;
};
console.log(intersection(setA, setB)); // [2,3]
console.log(new Set([...setA].filter(x => setB.has(x)))); // 使用 扩展运算符模拟 [2,3]
复制代码
const difference = (set1, set2) => { // 普通模拟
const differenceSet = new Set();
set1.forEach(value => {
if (!set2.has(value)) {
differenceSet.add(value);
}
});
return differenceSet;
};
console.log(difference(setA, setB));// [1]
console.log(new Set([...setA].filter(x => !setB.has(x)))); // 使用 扩展运算符模拟 [1]
复制代码
好了,今天的随手笔记完事儿了。本文内容全来自本人阅读过《学习Javascript数据结构与算法》第七章后稍加整理而成。