一、Set去重
ES6 中提供了全新的數據類型Set,它具有可以存儲任何類型的值,且每個值都是唯一的特性,這意味着它可以實現數組去重。利用Set去重的代碼可以非常簡潔高效:
const arr = [1, 2, 3, 4, 4, 3, 2, 1]; const newArr = Array.from(new Set(arr)); console.log(newArr); // [1, 2, 3, 4]
首先定義一個數組arr,然後使用new Set()將其轉化為Set,最後用Array.from()方法將Set轉化為數組newArr,這樣新數組newArr中的元素就已經去掉了重複的數字。
Set去重有一個非常明顯的優勢,它可以去掉基本數據類型以外的數據類型,例如對象:
const arr = [{a: 1}, {a: 2}, {a: 1}]; const newArr = Array.from(new Set(arr)); console.log(newArr); // [{a: 1}, {a: 2}]
這種方法的缺點是生成了新的數組,浪費一些空間。
二、filter方法去重
filter()方法傳入一個回調函數,該函數返回true時,當前元素才會保留下來,可以利用這個特性去重:
const arr = [1, 2, 3, 4, 4, 3, 2, 1]; const newArr = arr.filter((item, index) => { return arr.indexOf(item) === index; }); console.log(newArr); // [1, 2, 3, 4]
我們用filter()方法來過濾元素,然後利用indexOf()方法判斷該元素是否是第一次出現,如果是就保留下來。這種方法與Set方法相比,代碼量相對較長。
三、Map去重
Map是一種可以存儲任意類型鍵值對的有序集合,我們可以將數組中的元素作為key,值設為1,最後將Map的鍵返回成一個新數組:
const arr = [1, 2, 3, 4, 4, 3, 2, 1]; const map = new Map(); const newArr = []; arr.forEach((item) => { if(!map.has(item)) { map.set(item, 1); newArr.push(item); } }); console.log(newArr); // [1, 2, 3, 4]
這種方法在去重的同時保留了數組原有的順序。
四、reduce方法去重
reduce()方法對數組中的每一個元素執行一個指定的操作,並把結果匯總為單個返回值。我們可以在reduce方法中判斷當前元素是否在此前已經出現過,如果出現過就跳過,否則將其加入新數組中:
const arr = [1, 2, 3, 4, 4, 3, 2, 1]; const newArr = arr.reduce((prev, cur) => { if(!prev.includes(cur)) { prev.push(cur); } return prev; }, []); console.log(newArr); // [1, 2, 3, 4]
reduce方法的第二個參數可以指定初始值,上面代碼中我們將其設為一個空數組。相比於filter方法,這種方法在效率上稍微遜色一些。
五、雙重for循環去重
最簡單的去重方法是遍曆數組,使用雙重for循環依次判斷數組中的每一個元素是否重複:
const arr = [1, 2, 3, 4, 4, 3, 2, 1]; const newArr = []; for(let i = 0; i < arr.length; i++) { let flag = true; for(let j = 0; j < i; j++) { if(arr[j] === arr[i]) { flag = false; break; } } if(flag) { newArr.push(arr[i]); } } console.log(newArr); // [1, 2, 3, 4]
這種方法最為原始,缺點就是時間複雜度較高,不適用於大規模數據的去重。
六、使用lodash
使用第三方庫lodash可以大大簡化數組去重的操作:
const _ = require('lodash'); const arr = [1, 2, 3, 4, 4, 3, 2, 1]; const newArr = _.uniq(arr); console.log(newArr); // [1, 2, 3, 4]
在使用lodash時我們需要先安裝,可以使用npm install lodash命令進行安裝。
七、小結
本文詳細介紹了6種ES6數組去重的方法,包括Set去重、filter方法去重、Map去重、reduce方法去重、雙重for循環去重以及使用第三方庫lodash。不同的方法有不同的優缺點,我們可以根據場景和需求選擇最適合的方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238342.html