最近,碰到了数组去重,我来办它啦!正则表达式
一、建立一个新数组,并循环遍历原数组,将遍历的元素依次存放到新数组中;数组
二、循环遍历时,在新数组中对比是否有重复元素,若是有则终止遍历,不然,存放至新数组。浏览器
【注】为了兼容更多浏览器,我使用的是for循环,而没有用forEach简化。函数
let arr = [1,2,3,4,2,2,1,3] let newArr = [] for(let i=0; i<arr.length;i++) { let item = arr[i]; //存放遍历到的元素 if(newArr.includes(item)) { continue; } newArr.push(item); }
一、依次拿出数组的每一项A,用这一项A和它后面的每一项依次比较;性能
二、若是遇到和当前A相同的元素,则在原数组中把这一项移除掉。优化
let arr = [1,2,2,4,3,3,1] for(var i=0;i<arr.length;i++) { var item = arr[i]; for(var j=i+1;j<arr.length;j++) //当前项item后面全部的内容 { var compare = arr[j]; if(compare == item) { arr.splice(j,1); j--; //数组塌陷的解决方法 } } }
在哪引发了数组塌陷?为何呢?该怎么解决呢?spa
在内层循环的时候引发了数组塌陷:索引 j 后面的每一项索引都提早了一位!可是下次要比较的应该仍是 j 这个索引的内容!因此咱们在j++以后又将j- -,这样 j 索引就不会出错了。code
一、循环数组中的每一项,把每一项放至对象obj中进行存储:item 属性名/值:item变量存的值,obj [item]=item;对象
二、若是遇到obj[val]===val,那么该项必定存在,则删除;不然,追加到对象中;blog
三、永远记得处理数组塌陷问题。
能够看一下图解:
let arr = [1,2,2,4,3,3,1]; let obj={}; for(let i=0; i<arr.length;i++) { let item = arr[i]; if(obj[item] !== undefined) //obj中是否存在这一项 { arr.splice(i,1); i--; //注意数组塌陷的问题 continue; } obj[item]=item }
用最后一项换取当前重复项,同时删除最后一项。【代替splice方法】
同时进行了函数封装,方便使用。
//unique实现数组去重,返回去重后的数组 function unique(arr) { let obj={}; for(let i=0;i<arr.length;i++) { let item = arr[i]; if(obj[item] !== undefined) { arr[i] = arr[arr.length-1]; arr.length--; //删除数组最后一项 i--; continue; } obj[item] = item; } return arr; } console.log(unique([1,2,3,2,1,1,2]));
一、将数组转化为以@符间隔的字符串;
二、使用正则表达式:若是数字从1开始而且有一个@符,且出现了屡次;
三、将不符合正则表达式的元素追加至新数组中。
let arr = [1,2,3,2,2,3]; arr.sort((a,b) => a - b); //按升序排数组 let str = arr.join('@')+'@'; let reg = /(\d+@)\1*/g; let newArr = []; str.replace(reg,(n,m)=>{ m=Number(m.slice(0,m.length-1)); newArr.push(m); }); console.log(newArr);
let arr = [1,2,3,2,2,3]; arr = [...new Set(arr)]; console.log(arr);
以上就是我整理的一些数组去重的方法,但愿对你有帮助呀!^_^