1. 程式人生 > >陣列去重方法

陣列去重方法

雙迴圈去重

雙重 for (或 while)迴圈是比較笨拙的方法,它的實現原理很簡單:先定義一個包含原始陣列第一個元素的陣列,然後遍歷原始陣列,將原始陣列中的每個元素與新陣列的每個元素進行比較,如果不重複則新增到新的陣列中,最後返回新的陣列,其缺點是如果陣列長度很長,那麼將會非常消耗記憶體

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    let res = [arr[0]]
    for (let i = 1; i <
arr.length; i++) { let flag = true for (let j = 0; j < res.length; j++) { if (arr[i] === res[j]) { flag = false; break } } if (flag) { res.push(arr[i]) } } return res }

indexOf 方法去重(1)

陣列的 indexOf() 方法可以返回某個指定的元素在陣列中首次出現的位置。該方法首先定義一個空陣列 res ,然後呼叫 indexOf() 方法對原來的陣列進行遍歷判斷,如果元素不在 res 中,則將其 push 進 res 中,最後將 res 返回即可獲得去重的陣列

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    let res = []
    for (let i = 0; i < arr.length;
i++) { if (res.indexOf(arr[i]) === -1) { res.push(arr[i]) } } return res }

indexOf 方法去重(2)

利用 indexOf 檢測元素在陣列中第一次出現的位置是否和元素現在的位置相等,如果不相等則說明該元素是重複元素

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return Array.prototype.filter.call(arr, function(item, index){
        return arr.indexOf(item) === index;
    });
}

相鄰元素去重

這種方法首先呼叫了陣列排序的方法 sort() ,然後根據排序後的結果進行遍歷及相鄰元素對比,如果相等則跳過該元素,直到遍歷結束

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    arr = arr.sort()
    let res = []
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] !== arr[i-1]) {
            res.push(arr[i])
        }
    }
    return res
}

利用物件屬性去重

建立空物件,遍歷陣列,將陣列中的值設為物件的屬性,並給該屬性賦值 1 ,每出現一次,對應的屬性值就增加 1 ,這樣,屬性值對應的就是該屬性出現的次數了

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    let res = [],
        obj = {}
    for (let i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
            res.push(arr[i])
            obj[arr[i]] = 1
        } else {
            obj[arr[i]]++
        }
    }
    return res
}

set 與解構賦值

ES6 中新增了資料型別 set ,set 的一個最大的特點就是資料不重複。Set 函式可以接受一個數組(或類陣列物件)作為引數來初始化,利用該特性也能做到陣列去重

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return [...new Set(arr)]
}

Array.from 與 set 去重

Array.from 方法可以將 Set 結構轉換為陣列結果,而我們知道 set 結果是不重複的資料集,因此能夠達到去重的目的

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return Array.from(new Set(arr))
}