1 function Set() { 2 var items = {}; 3 /** 4 * 添加元素 5 * @param {[type]} value [description] 6 */ 7 this.add = function(value) { 8 if (!this.has(value)) { 9 items[value] = value; 10 return true; 11 } 12 return false; 13 }; 14 /** 15 * 删除元素 16 * @param {[type]} value [description] 17 * @return {[type]} [description] 18 */ 19 this.remove = function(value) { 20 if (this.has(value)) { 21 delete items[value]; 22 return true; 23 } 24 return false; 25 }; 26 /** 27 * 判断元素是否存在集合里 28 * @param {[type]} value [description] 29 * @return {Boolean} [description] 30 */ 31 this.has = function(value) { 32 return items.hasOwnProperty(value); 33 }; 34 /** 35 * 清空集合 36 * @return {[type]} [description] 37 */ 38 this.clear = function() { 39 items = {}; 40 }; 41 /** 42 * 获取集合的长度 43 * @return {[type]} [description] 44 */ 45 this.size = function() { 46 return Object.keys(items).length; 47 }; 48 /** 49 * 获取集合的长度(兼容IE8) 50 * @return {[type]} [description] 51 */ 52 this.sizeLegacy = function() { 53 var count = 0; 54 for (var prop in items) { 55 if (items.hasOwnProperty(prop)) 56 ++count; 57 } 58 return count; 59 }; 60 /** 61 * 获取集合 62 * @return {[type]} [description] 63 */ 64 this.values = function() { 65 return Object.keys(items); 66 }; 67 /** 68 * 获取集合(兼容IE8) 69 * @return {[type]} [description] 70 */ 71 this.valuesLegacy = function() { 72 var keys = []; 73 for (var key in items) { 74 keys.push(key); 75 } 76 return keys; 77 }; 78 /** 79 * 并集 80 * @param {[type]} otherSet [description] 81 * @return {[type]} [description] 82 */ 83 this.union = function(otherSet) { 84 var unionSet = new Set(); 85 86 var values = this.valuesLegacy(); 87 for (var i = 0; i < values.length; i++) { 88 unionSet.add(values[i]); 89 } 90 91 values = otherSet.valuesLegacy(); 92 for (var i = 0; i < values.length; i++) { 93 unionSet.add(values[i]); 94 } 95 return unionSet; 96 }; 97 /** 98 * 交集 99 * @param {[type]} otherSet [description] 100 * @return {[type]} [description] 101 */ 102 this.intersection = function(otherSet) { 103 var intersectionSet = new Set(); 104 105 var values = this.valuesLegacy(); 106 for (var i = 0; i < values.length; i++) { 107 if (otherSet.has(values[i])) { 108 intersectionSet.add(values[i]); 109 } 110 } 111 112 return intersectionSet; 113 }; 114 /** 115 * 差集 116 * @param {[type]} otherSet [description] 117 * @return {[type]} [description] 118 */ 119 this.difference = function(otherSet) { 120 var differenceSet = new Set(); 121 122 var values = this.valuesLegacy(); 123 for (var i = 0; i < values.length; i++) { 124 if (!otherSet.has(values[i])) 125 differenceSet.add(values[i]); 126 } 127 return differenceSet; 128 }; 129 /** 130 * 子集 131 * @param {[type]} otherSet [description] 132 * @return {[type]} [description] 133 */ 134 this.subset = function(otherSet) { 135 if (this.sizeLegacy() > otherSet.sizeLegacy()) { 136 return false; 137 } else { 138 var values = this.valuesLegacy(); 139 for (var i = 0; i < values.length; i++) { 140 if (!otherSet.has(values[i])) { 141 return false; 142 } 143 } 144 return true; 145 } 146 } 147 } 148 149 var set = new Set(); 150 set.add(1); 151 set.add(2); 152 set.add(3); 153 154 var set1 = new Set(); 155 set1.add(3); 156 set1.add(4); 157 set1.add(5); 158 159 var set2 = new Set(); 160 set2.add(3); 161 162 var unionSet = set.union(set1); 163 console.log(unionSet.valuesLegacy()); 164 165 var intersectionSet = set.intersection(set1); 166 console.log(intersectionSet.valuesLegacy()); 167 168 var differenceSet = set.difference(set1); 169 console.log(differenceSet.valuesLegacy()); 170 171 console.log(set.subset(set1)); 172 console.log(set2.subset(set));