JS算法入門(1)-去重

前言

開發中,經常會遇到對一個數組重複的元素進行去重處理,這裏簡單介紹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]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章