js 數組深度去重

來源:互聯網
上載者:User

標籤:返回   pre   合并   str   否則   function   容器   rop   unique   

  在日常開發中難免會遇到數組去重的難題,最近,正是給一個數組去重的難題難到了。作為開發人員的我們,一旦遇到問題必然就是Google,百度,MDN....搜尋一波,但是,這些地方都沒有找到我想要的答案。或許看到這你會開噴了,咋沒有啊,網上一大堆去重方法,但是,這裡的需求要的是深度去重,也就是說,參考型別也要去掉!!這時你會發現很多方法都不管用了,看了一波度娘的答案,絕大部分的都是迴圈,索引相等的方法去重,而且舉的例子都是基礎資料型別 (Elementary Data Type)的去重,如果手上拿的是一個全是參考型別的數組,你會發現這些方法都沒用了。在講正題之前,先講一個基礎資料型別 (Elementary Data Type)去重的方法:

arr = Array.from(new Set(arr))

注意:該方法也只能用在全是基本類型的數組上,一旦有重複的參考型別的資料就無法過濾了。

  回到正題上,怎麼給參考型別的數組去重,先定義下面一個方法:

function getType(target) {     return Object.prototype.toString.call(target).slice(8,-1)}

該方法用於區分對象和數組,如果是對象,則返回的是 Object ,如果是數組,則返回 Array。

定義方法,用於檢查兩個對象裡面的內容是否一致,若一致,返回 true ,否則返回 false:

function objUnique(a,b) {     if(getType(a) !== ‘Object‘ && getType(b) !== ‘Object‘){         return false     }     let testList = Object.keys(a)     for(let i = 0;i < testList.length;i++){         let propName = testList[i]         if(getType(a[propName]) === ‘Object‘ && getType(b[propName]) === ‘Object‘){             objUnique(a[propName],b[propName])         }else if(getType(a[propName]) === ‘Array‘ && getType(b[propName]) === ‘Array‘){             arrUnique(a[propName],b[propName])         }else if(a[propName] !== b[propName]){             return false         }     }     return true}

定義方法,用於檢測兩個數組的內容是否一致,若一致返回 true,否則返回 false:

function arrUnique(a, b) {    if(getType(a) !== ‘Array‘ && getType(b) !== ‘Array‘){       return false    }    if(a.length !== b.length){       return false    }    for(let i = 0;i < a.length;i++){       if(getType(a[i]) === ‘Object‘ && getType(b[i]) === ‘Object‘){            objUnique(a[i],b[i])       }else if(getType(a[i]) === ‘Array‘ && getType(b[i]) === ‘Array‘){            arrUnique(a[i],b[i])       }else if(a[i] !== b[i]){            return false       }    }    return true}

最後,講目標數組所有元素進行分類(當然,這裡忽略了元素的順序,如果數組元素沒有順序要求,或者數組的元素全是同一種類型的情況,則可以正常使用,否則另尋辦法),分別將基本類型,對象,數組放入一個容器中,然後用上面的三個方法分別對裡面的所有元素進行去重,再將三個數組重新組合:

function unique(arr) {    if(getType(arr) !== ‘Array‘){        return null    }    // 基礎資料型別 (Elementary Data Type)容器    let commonList = []    // 對象收納容器    let objList = []    // 數組收納容器    let arrList = []    // 資料分類    arr.forEach(item => {        if(getType(item) === ‘Object‘){            objList.push(item)        }else if(getType(item) === ‘Array‘){            arrList.push(item)        }else{            commonList.push(item)        }    })    // 基礎資料型別 (Elementary Data Type)去重    commonList = Array.from(new Set(commonList))    // 對象收納容器去重    for(let i = 0;i < objList.length;i++){        for(let j = i + 1;j < objList.length;j++){            if(objUnique(objList[i],objList[j])){                objList.splice(j,1)                j--            }        }    }    // 數組收納容器去重    for(let i = 0;i < arrList.length;i++){        for(let j = i + 1;j < arrList.length;j++){            if(arrUnique(arrList[i],arrList[j])){                arrList.splice(j,1)                j--            }        }    }    // 合并收納容器    return [...commonList,...objList,...arrList]}

這裡,再強調一次,如果數組元素沒有順序要求,或者數組中所有元素都是同一類型(都是對象或都是數組),才可使用。另外,如果還有更好的方法歡迎補充,謝謝。

js 數組深度去重

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.