ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重復的值。
const s = new Set(); [2,3,5,4,5,2,2].forEach(x => s.add(x)); // Set結構不會添加重復的值 for(let i of s) { console.log(i); } // ## 初始化 // 例一 可以接受一個數組作為參數 const set = new Set([1,2,3,4,4,]); // ...將一個數組轉為用逗號分隔的參數序列 console.log([...set]); // 例二 const items = new Set([1,2,3,4,5,5,5,5,]); console.log(items.size); // 例三 可以接受具有iterable接口的其他數據結構作為參數 const set2 = new Set(document.querySelectorAll('div')); console.log(set.size); // 類似於 const set2 = new Set(); document .querySelectorAll('div') .forEach(div => set.add(div)); console.log(set.size); // set中NaN等於自身,其余比較相當於 === let set3 = new Set(); let a = NaN; let b = NaN; set3.add(a); set3.add(b); console.log(set3) // 兩個對象總是不相等的 let set4 = new Set(); set4.add({}); // 1 console.log(set4.size); set4.add({}); // 2 console.log(set4.size);
const s = new Set(); s.add(1).add(2).add(2); console.log(s.size); console.log(s.has(1)); console.log(s.has(2)); console.log(s.has(3)); s.delete(2); console.log(s.has(2)); // set轉數組 const items = new Set([1,2,3,4,5]); const array = Array.from(items); console.log(array); // 去除數組重復成員 function dedupe(array) { return console.log(Array.from(new Set(array))); } dedupe([1,1,2,3]);
let set = new Set(['red', 'green', 'blue']); // 返回鍵名 for(let item of set.keys()) { console.log(item); } // 返回鍵值 for(let item of set.values()) { console.log(item); } // set 鍵名=鍵值 // 返回鍵值對 for(let item of set.entries()){ console.log(item); } // 可以直接用 for of遍歷Set // for in 和 for of的區別是:in 是遍歷對象,of是遍歷值 for (let x of set) { console.log(x); } // set也有forEach()方法 set.forEach((value, key) => console.log(key + ' : ' + value)); // 此處forEach方法的參數是一個處理函數。 // 數組的 map 和 filter 方法也可以間接用於Set let s = new Set([1,2,3]); // map 將原數組映射成新數組 s = new Set([...s].map(x => x * 2)); console.log(s); // filter返回過濾后的新數組 s = new Set([...s].filter(x => (x % 3) ==0)); console.log(s); // 實現並集、交集、差集 let a = new Set([1,2,3]); let b = new Set([4,3,2]); let union = new Set([...a, ...b]); console.log(union); let intersect = new Set([...a].filter(x => b.has(x))); console.log(intersect); let difference = new Set([...a].filter(x => !b.has(x))); console.log(difference); // 在遍歷操作中,同步改變原來的Set結構的兩種變通方法 // 1.利用原Set結構映射出一個新的結構,然后賦值給原來的Set結構 let set1 = new Set([1,2,3]); set1 = new Set([...set1].map(val => val *2)); console.log(set1); // 2.利用Array.from let set2 = new Set([1,2,3]); set2 = new Set(Array.from(set2, val => val * 2)); console.log(set2);