1. 使用Set ES6 提供了新的數據結構Set, 它類似數組,和C++中的set容器一樣,它成員的值都是唯一的,沒有重覆的值;Set本身是一個構造函數,用來生成Set數據結構。 還有更簡單的方式 上面這種方式在於Array.from方法可以將Set結構轉化為數組。如果你還覺得不過癮,那麼還有一種 ...
1. 使用Set
ES6 提供了新的數據結構Set, 它類似數組,和C++中的set容器一樣,它成員的值都是唯一的,沒有重覆的值;Set本身是一個構造函數,用來生成Set數據結構。
var s = new Set(); s.add("hello").add("goodbye").add("hello"); s.size === 2; s.has("hello") === true;
const s = new Set(); [2,3,5,4,5,2,2].forEach(x => s.add(x)); for(let i of s) { console.log(i); } // 2 3 5 4
還有更簡單的方式
function dedupe(array) { return Array.from(new Set(array)); } dedupe([1, 1, 2, 3]);//[1, 2, 3]
上面這種方式在於Array.from方法可以將Set結構轉化為數組。如果你還覺得不過癮,那麼還有一種表示方式:將擴展運算符(...)與Set結構相結合,就可以去除數組的重覆成員;擴展運算符內部使用for...of迴圈。
[...new Set(array)]
2. indexOf的方法
這種方法新建一個存儲數組,遍歷參數數組,如果新數組中沒找到該元素的索引,則把該元素push進新數組。
function dedupe(array) { var newArr = []; for(var i=0; i<array.length; i++) { if(newArr.indexOf(array[i]) == -1) { newArr.push(array[i]); } } return newArr; } var arr = [1, 1, 2, 2, 3, 3]; console.log(dedupe(arr));//[1, 2, 3]
3. 比較數組下標
我們知道,通過比較數組下標可以從數組中找到重覆的數字,那麼自然可以根據數組成員第一次時的索引值i進行判斷,該方法類似indexOf的方法。
function dedupe(array) { var newArr = []; for(var i=0; i<array.length; i++) { if(array.indexOf(array[i]) == i) { newArr.push(array[i]); } } return newArr; } var arr = [1, 1, 2, 2, 3, 3]; console.log(dedupe(arr));//[1, 2, 3]
4. 對象查找
function dedupe(arr) { var res = []; var o = Object.create(null); for(let v of arr) { var type = typeof v; if(!o[v]) { res.push(v); o[v] = [type]; }else if(o[v].indexOf(type) == -1) { o[v].push(type); res.push(v); } } return res; } var arr = [1, 2, '2', 4, 7, 'a', 'a', 2, 3, 7, 6, 7]; console.log(dedupe(arr));//[1, 2, '2', 4, 7, 'a', 3, 6]
5. 排序相鄰去重
function dedupe(arr) { arr.sort(); var newArr = [arr[0]]; for(var i=1; i<arr.length; i++) { if(arr[i] !== newArr[newArr.length-1]) { newArr.push(arr[i]); } } return newArr; } var arr = [1, 2, '2', 4, 7, 'a', 'a', 2, 3, 7, 6, 7]; console.log(dedupe(arr));//[1, "2", 2, 3, 4, 6, 7, "a"]
6. 數組實例的includes方法
function dedupe(arr) { var res=[]; for(let v of arr) { if(!res.includes(v)) { res.push(v); } } return res; } var arr = [1, 2, '2', 4, 7, 'a', 'a', 2, 3, 7, 6, 7]; console.log(dedupe(arr));//[1, 2, "2", 4, 7, "a", 3, 6]
7. 暴力去重
function dedupe(arr) { arr.sort(); console.log(arr); for(var i=1; i<arr.length; i++) { if(arr[i]===arr[i-1]) { arr.splice(i, 1); i--; } } return arr; } var arr = [1, 2, '2', 4, 2, 7, 'a', 'a', 2, 3, 7, 6, 7, 7, 7]; console.log(dedupe(arr)); //[1, "2", 2, 2, 2, 3, 4, 6, 7, 7, 7, 7, 7, "a", "a"] //[1, "2", 2, 3, 4, 6, 7, "a"] var arr0 = [5, 1, 2, '2', 4, '2', 2, 5, 7, 'a', 'a', 2, 3, '7', 6, '7', 7, 7]; console.log(dedupe(arr)); //[1, 2, "2", "2", 2, 2, 3, 4, 5, 5, 6, 7, 7, "7", 7, "7", "a", "a"] //[1, 2, "2", 2, 3, 4, 5, 6, 7, "7", 7, "7", "a"]
上面這種方式最好只用在數字數組或字元串數組去重,由於sort()排序方式的原因,再加上只比較相鄰元素是否相等,當出現如arr0類似數組時,去重將會出現遺漏;因此最好對單一類型數組進行去重;
參考:
http://es6.ruanyifeng.com/#docs/set-map
http://es6.ruanyifeng.com/#docs/array