集合是由一組無序且惟一的項組成的。(即不能重複的)
集合是一組不一樣的對象(的集)。好比說,一個由大於或等於0的整數組成的天然數集合:N={0,1,2,3,4,5,6,…}。
集合也有並集、交集、差集等基本操做。下面將介紹這些操做es6
function Set() { var items = {}; }
接下來,須要聲明一些集合可用的方法數組
add(value):向集合添加一個新的項。 delete(value):從集合移除一個值。 has(value):若是值在集合中,返回true,不然返回false。 clear():移除集合中的全部項。 size():返回集合所包含元素的數量。與數組的length屬性相似。 values():返回一個包含集合中全部值的數組。
has(value):若是值在集合中,返回true,不然返回false。測試
/** * @description 定義一個集合是否有該值的方法 * @param {string} 值 * @return {boolean} */ this.has = value => value in items;
add(value):向集合添加一個新的項。this
/** * @description 添加 */ this.add = value => { if (!this.has(value)) { items[value] = value; return true; } return false; }
delete(value):從集合移除一個值。spa
/** * @description 刪除 */ this.delete = value => { if (this.has(value)) { delete items[value]; return true; } return false; }
clear():移除集合中的全部項。3d
/** * @description 清除 */ this.clear = () => { items = {}; return true; }
size():返回集合所包含元素的數量。與數組的length屬性相似。code
/** * @description 求集合長度 */ this.size = () => Object.keys(items).length;
values():返回一個包含集合中全部值的數組。對象
/** * @description 返回集合中值的數組 */ this.values = () => Object.values(items);
測試咱們的Set類blog
var set = new Set(); set.add(1); console.log(set.values()); //輸出["1"] console.log(set.has(1)); //輸出true console.log(set.size()); //輸出1 set.add(2); console.log(set.values()); //輸出["1", "2"] console.log(set.has(2)); //true console.log(set.size()); //2 set.delete(1); console.log(set.values()); //輸出["2"] console.log(set.has(2)); //false console.log(set.size()); //1 set.delete(2); console.log(set.values()); //輸出[] console.log(set.has(2)); //false console.log(set.size()); //0
對集合能夠進行以下操
一、並集:對於給定的兩個集合,返回一個包含兩個集合中全部元素的新集合
實現Set類的union方法ip
/** * @description 並集 */ this.union = setB => { let unionSet = new Set(); const values = this.values(); for (let i = 0; i < values.length; i++) { unionSet.add(values[i]); } const setBValues = setB.values(); for (let i = 0; i < setBValues.length; i++) { if (!unionSet.has(setBValues[i])) { unionSet.add(setBValues[i]); } } return unionSet; }
輸出爲[1, 2, 3, 4, 5, 6]。注意元素3同時存在於A和B中,它在結果的 集合中只出現一次。
二、交集:對於給定的兩個集合,返回一個包含兩個集合中共有元素的新集合
如今來實現Set類的intersection方法:
/** * @description 交集 */ this.intersection = setB => { let intersectionSet = new Set(); const values = this.values(); for (let i = 0; i < values.length; i++) { if (setB.has(values[i])) { intersectionSet.add(values[i]); } } return intersectionSet; }
三、差集:對於給定的兩個集合,返回一個包含全部存在於第一個集合且不存在於第二個集合的元素的新集合
/** * @description 差集 */ this.difference = setB => { let differenceSet = new Set(); const values = this.values(); for (let i = 0; i < values.length; i++) { if (!setB.has(values[i])) { differenceSet.add(values[i]); } } return differenceSet; }
四、子集:驗證一個給定集合是不是另外一集合的子集
/** * @description 子集 */ this.subset = setB => { if (this.size > setB.size) { return false; } const values = this.values(); for (let i = 0; i < values.length; i++) { if (!setB.has(values[i])) { return false; } } return true; } }
完整代碼
function Set() { let items = {}; // 定義一個集合 /** * @description 定義一個集合是否有該值的方法 * @param {string} 值 * @return {boolean} */ this.has = value => value in items; /** * @description 添加 */ this.add = value => { if (!this.has(value)) { items[value] = value; return true; } return false; } /** * @description 刪除 */ this.delete = value => { if (this.has(value)) { delete items[value]; return true; } return false; } /** * @description 清除 */ this.clear = () => { items = {}; return true; } /** * @description 求集合長度 */ this.size = () => Object.keys(items).length; /** * @description 返回集合中值的數組 */ this.values = () => Object.values(items); /** * @description 並集 */ this.union = setB => { let unionSet = new Set(); const values = this.values(); for (let i = 0; i < values.length; i++) { unionSet.add(values[i]); } const setBValues = setB.values(); for (let i = 0; i < setBValues.length; i++) { if (!unionSet.has(setBValues[i])) { unionSet.add(setBValues[i]); } } return unionSet; } /** * @description 交集 */ this.intersection = setB => { let intersectionSet = new Set(); const values = this.values(); for (let i = 0; i < values.length; i++) { if (setB.has(values[i])) { intersectionSet.add(values[i]); } } return intersectionSet; } /** * @description 差集 */ this.difference = setB => { let differenceSet = new Set(); const values = this.values(); for (let i = 0; i < values.length; i++) { if (!setB.has(values[i])) { differenceSet.add(values[i]); } } return differenceSet; } /** * @description 子集 */ this.subset = setB => { if (this.size() > setB.size()) { return false; } const values = this.values(); for (let i = 0; i < values.length; i++) { if (!setB.has(values[i])) { return false; } } return true; } }
驗證
// 合集 let setA = new Set(); setA.add(1); setA.add(2); setA.add(3); let setB = new Set(); setB.add(3); setB.add(4); setB.add(5); setB.add(6); let unionAB = setA.union(setB); console.log('合集'); console.log(setA.values()); console.log(setB.values()); console.log(unionAB.values()); // [1,2,3,4,5,6] // 交集 let setC = new Set(); setC.add(1); setC.add(2); setC.add(3); let setD = new Set(); setD.add(2); setD.add(3); setD.add(4); let intersectionCD = setC.intersection(setD); console.log('交集'); console.log(setC.values()); console.log(setD.values()); console.log(intersectionCD.values()); // [2,3] // 差集 let setE = new Set(); setE.add(1); setE.add(2); setE.add(3); let setF = new Set(); setF.add(2); setF.add(3); setF.add(4); let differenceEF = setA.difference(setF); console.log('差集'); console.log(setE.values()); console.log(setF.values()); console.log(differenceEF.values()); // [1] // 子集 let setH = new Set(); setH.add(1); setH.add(2); let setI = new Set(); setI.add(1); setI.add(2); setI.add(3); let setG = new Set(); setG.add(2); setG.add(3); setG.add(4); console.log('子集'); console.log(setH.values()); console.log(setI.values()); console.log(setG.values()); console.log(setH.subset(setI)); // true console.log(setI.subset(setG)); // false
let arr = [3, 5, 2, 2, 5, 5]; let unique = [...new Set(arr)]; console.log(unique)// [3, 5, 2]
let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 並集 let union = new Set([...a, ...b]); console.log(union)// Set {1, 2, 3, 4} // 交集 let intersect = new Set([...a].filter(x => b.has(x))); console.log(intersect)// set {2, 3} // 差集 let difference = new Set([...a].filter(x => !b.has(x))); console.log(difference)// Set {1}