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