JavaScript數組去重方法總結

數組不像對象和hash有惟一的標誌特徵(key)。因此,數組去重的核心就是【1】數組內元素互相比較,而後放入新的數組中。【2】參照對象構建一個惟一的特徵標誌,而後放入新數組中。如下就是依照這種思路產生的方法。【3】數組中含對象的去重方式我採用使用JSON.stringify()將對象轉換成JSON字符串進行比較的方式。數組

1.最基礎的去重:雙重遍歷

  • 雙重遍歷的核心就是依據【1】,經過拿出一個元素和剩下的元素依次比較,若是所有不相等則證實此元素爲惟一。
let a=[{a:1},{b:2},{c:3},{a:1},{d:2}]
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
    let b=[]
    for(let i=0;i<arr.length;i++){
        let unexit=true
        for(let j=i+1;j<arr.length;j++){
            if(JSON.stringify(arr[i])===JSON.stringify(arr[j])){
                unexit=false
                break
            }
            else{
                unexit=true
            }
        }
        if(unexit){
            b.push(arr[i])
        }
    }
    return b
}
複製代碼
  • 關於數組中存在對象,是採用JSON.stringify()轉換成JSON字符串進行的比較,後續再也不敘述。雙重遍歷的缺點是複雜度過高。
  • 上面的代碼去重獲得的結果的順序會改變,因此若是想要順序按照原有順序,數組在進行去重時建議從新申明一個新的數組(var new=old.reverse())獲得一個新的相反的數組,最後再使用reverse()。之因此新建數組而不是直接取反是由於:reverse()會修改原數組。

2.Array.prototype.sort():相鄰元素去重

相鄰元素去重的核心在於Array.sort()可以對數組進行排序。這樣相等的數組就會在相鄰的位置,經過比較相鄰的元素就能夠起到去重的做用【1】。bash

let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
    let Arr=arr.sort()
    let b=[]
    for(let i=0;i<Arr.length;i++){
        if(Arr[i]!==Arr[i+1]){
            b.push(Arr[i])
        }
    }
    return b
}
複製代碼
  • Array.prototype.sort()方法可使用array.sort((a,b)=>{a.key-b.ky})進行對象的排序,前提是數組中的對象存在相同的key值。

3.Object.keys():存在惟一性

在一個對象裏面key值是惟一的,因此經過遍歷數組給每一個數組一個標誌,經過標誌去重【2】數據結構

let a=[{a:1},{b:2},{c:3},{a:1},{d:2}]
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
    let b=[]
    let hash={}
    for(let i=0;i<arr.length;i++){
        if(!hash[JSON.stringify(arr[i])]){
            hash[JSON.stringify(arr[i])]=true
            b.push(arr[i])
        }
    }
    return b
}

複製代碼

4.雙重遍歷去重改良之:indexOf

  • 雙重遍歷的思路咱們都知道,先拿出一個元素,而後使用循環再次遍歷數組去一一比較。若是有一個方式可以讓咱們再也不遍歷一遍數組,那麼複雜度相對而言會減小一點。
  • indexOf 方法返回給定元素在數組中第一次出現的位置,若是沒有出現則返回-1。首先咱們新建一個空數組(arry),若是:arry.indexOf(數組元素)===-1,那麼咱們就能夠知道arry中不存在元素。
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
    let b=[]
    for(let i=0;i<arr.length;i++){
        if(b.indexOf(arr[i])==-1){
            b.push(arr[i])
        }
    }
    return b
}
複製代碼
  • indexOf 方法可返回某個指定的字符串值在字符串中首次出現的位置。因此對象不適用,由於對象轉爲字符串就都會變成{object,object},沒法比較。

5.循環遍歷之:map()/forEach()

  • map()和forEach()均可以實現遍歷數組。因此以上的方法均可以用map()、forEach()改寫。下面我只簡單的改寫一個,其餘的改寫方式參照便可。
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
    let b=[]
    arr.forEach(res=>{
        if(b.indexOf(res)==-1){
            b.push(res)
        }
    })
    return b
}
複製代碼

6.ES6:Set數據結構

Set數據相似於數組,可是成員的值都是惟一的,沒有重複的值。它能夠接收一個數組,類於:let a=[1,2,3,1,2] Set(a)=>1,2,3 因此可使用Set()實現去重。ui

let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
    let b=new Set(arr)
    let c=Array.from(b)
    return c
}
複製代碼
  • Set去重不適用於含對象的數組,由於Set的去重參照的是(===),數組中的元素對象,雖然可能數值相等,可是地址不相等。因此Set沒法實現去重。

7.總結

  • 實現數組的去重,要麼經過元素對比,要麼設置特殊標誌識別。元素對比的思路有2種:一種是和原數組一一對比;另外一種和新的數組對比。
  • 若是要實現含對象的數組去重,通常使用遍歷的方式,包括使用遍歷類的方法(map、forEach、reduce等)。像Set、sort等經過改變數組的方式通常是不可行的。
相關文章
相關標籤/搜索