目的:ES6标准下的JS数据结构的一些实现代码。(作为记录和启发)
内容:集合。(未完成,待继续)
所有源码在我的Github上(如果觉得不错记得给星鼓励我哦):ES6的JavaScript数据结构实现之集合
注:Set类在ES6中已经提供了原生的Set结构。
一、基础数据结构
1、集合(非ES6自带的原生Set)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| class Set { constructor() { this.items = {}; } has(element) { 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; } values() { return Object.values(this.items); } 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(); 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; } 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; } let isSubset = true; this.values().every(values => { if(!otherSet.has(values)) { isSubset = false; return false; } return true; }); return isSubset; }
isEmpty() { return this.size() === 0; } toString() { if (this.isEmpty()) { return ''; } const values = this.values(); let objString = `${values[0]}`; for (let i = 1; i < values.length; i++) { objString = `${objString},${values[i].toString()}`; } return objString; }
}
const set = new Set(); set.add(1); set.add(2); set.add(3); console.log(set); set.delete(1); console.log(set); console.log(set.size()); console.log(set.values()); const setB = new Set(); setB.add(3); setB.add(5); setB.add(6); console.log(setB); console.log(set.union(setB)); console.log(set.intersection(setB)); console.log(set.difference(setB)); console.log(setB.difference(set)); console.log(set.isSubsetOf(setB)); const setC = new Set(); setC.add(5); setC.add(6); console.log(setC.isSubsetOf(setB));
|
2、ES6原生的Set类。(ES6中的原生的Set没有交、并、差运算,需要我们自己写。同时,我们可以结合使用扩展运算符,把集合转为为数组,再对数组进行运算,再转回集合。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| const set = new Set();
set.add(1); console.log(set.values()); console.log(set.has(1)); console.log(set.size);
set.add(2); console.log(set.values()); console.log(set.has(2)); console.log(set.size);
set.delete(1); console.log(set.values());
set.delete(2); console.log(set.values());
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));
console.log(new Set([...setA, ...setB]));
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));
console.log(new Set([...setA].filter(x => setB.has(x))));
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));
console.log(new Set([...setA].filter(x => !setB.has(x))));
|