前言

开发中,经常会遇到对一个数组重复的元素进行去重处理,这里简单介绍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]