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