数组去重方法整理

最近,碰到了数组去重,我来办它啦!正则表达式


方法一:最容易想到的思路

一、建立一个新数组,并循环遍历原数组,将遍历的元素依次存放到新数组中;数组

二、循环遍历时,在新数组中对比是否有重复元素,若是有则终止遍历,不然,存放至新数组。浏览器

【注】为了兼容更多浏览器,我使用的是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);
}

 

方法二:一个麻烦的思路o(╥﹏╥)o,主要是为了引出数组塌陷的问题。

一、依次拿出数组的每一项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方法,此方法的当前一项被删除,那么后面每一项的索引都要向前提一位,若是后面内容过多,必定影响性能。因此,咱们引入了方法四...


 

方法四:对象法的优化

用最后一项换取当前重复项,同时删除最后一项。【代替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);

 

方法六:ES6 SET

let arr = [1,2,3,2,2,3];
arr = [...new Set(arr)];
console.log(arr);

 

以上就是我整理的一些数组去重的方法,但愿对你有帮助呀!^_^

相关文章
相关标签/搜索