前言
開發中,經常會遇到對一個數組重複的元素進行去重處理,這裏簡單介紹5種方案
1.先排序,再利用正則相鄰比較
1 let arr = [12,23,12,15,25,23,25,14,16] 2 3 /* 4 方法1:先排序,再利用正則相鄰比較 5 */ 6 arr.sort((a,b) => a-b) 7 let str = arr.join('@') + '@' // str: 12@12@14@15@16@23@23@25@25@ 8 let reg = /(\d+@)\1*/g, 9 ary = []; 10 str.replace(reg, (n,m) => { 11 // console.log(n,m); 12 m = Number(m.slice(0,m.length - 1)) //截取 去掉每一項的@ 並轉換爲數字 13 ary.push(m) //添加到新數組 14 }) 15 console.log(ary); //[ 12, 14, 15, 16, 23, 25 ]
2.ES6中的Set方法
1 /* 2 方法2:Set方法 3 */ 4 arr = [... new Set(arr)] 5 console.log(arr); //[ 12, 23, 15, 25, 14, 16 ]
3.拿出當前項和後面的內容進行比較
1 for(let i = 0; i< arr.length - 1; i++){ 2 let current = arr[i], //當前項 3 res = arr.slice(i+1) //剩餘數組內容 4 if(res.includes(current)){ 5 arr[i] = null 6 } 7 } 8 arr = arr.filter( item=> item != null) 9 console.log(arr);
下面的寫法會出現數組塌陷,所以需要注意:
1 for(let i = 0; i< arr.length - 1; i++){ 2 let current = arr[i], //當前項 3 res = arr.slice(i+1) //剩餘數組內容 4 if(res.includes(current)){ 5 arr.splice(i,1) //容易造成數組塌陷 6 } 7 i-- //改變數組每一項的索引,會導致性能問題 8 } 9 // arr = arr.filter( item=> item != null) 10 console.log(arr);
4. 鍵值對方法:那數組中的每項想形容中存儲,如果已經存儲過了,把當前項幹掉
1 * 2 方法4:鍵值對方法:那數組中的每項想形容中存儲,如果已經存儲過了,把當前項幹掉 3 */ 4 let obj = {}; 5 for(let i=0;i<arr.length;i++){ 6 let item = arr[i]; 7 if(typeof obj[item] !== 'undefined'){//對象obj中存在item屬性 8 arr[i] = arr[arr.length-1] 9 arr.length--; 10 i--; 11 continue; 12 } 13 obj[item] = item; //將該項的作爲鍵值對 14 } 15 obj = null //釋放對象地址 16 console.log(arr); //[12, 23, 16, 15, 25, 14]