數組去重方法整理

最近,碰到了數組去重,我來辦它啦!正則表達式


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

一、建立一個新數組,並循環遍歷原數組,將遍歷的元素依次存放到新數組中;數組

二、循環遍歷時,在新數組中對比是否有重複元素,若是有則終止遍歷,不然,存放至新數組。瀏覽器

【注】爲了兼容更多瀏覽器,我使用的是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);

 

以上就是我整理的一些數組去重的方法,但願對你有幫助呀!^_^

相關文章
相關標籤/搜索