关于数组的去重

时间:2023-02-10 23:17:57

一、简单一维数组的去重:

简单一维数组的去重方法有很多,这种数组里面的值都是普通的数据类型,并没有对象,因此去重方法有很多,这里总结一下常用的四种方法(网上还有一些其它的方法):
方法一:双层循环去重

function uniqueArr(arr) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[i] === arr[j]) {
                j = ++i;
            }
        }
        result.push(arr[i]);
    }
    return result;
}

方法二:利用对象的属性不能相同去重

function uniqueArr(arr) {
    var result = [];
    var obj = {};
    for (var i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
            obj[arr[i]] = 1;
            result.push(arr[i]);
        }
    }
    return result;
}

方法三:利用下标

function uniqueArr(arr) {
    var result = [arr[0]];
    for (var i = 1; i < arr.length; i++) {
        if (result.indexOf(arr[i]) == -1) {
            result.push(arr[i]);
        }
    }
    return result;
}

方法四:ES6去重

function uniqueArr(arr) {
    return Array.from(new Set(arr));
}

二、包含对象的二维数组去重:

假设有这样的一个二维数组,数组里面多个对象的属性至少有一个都一样,那就该如何去除重复的数据呢?这里总结一下两种方法:
方法一:双重循环去除法

function uniqueArr(arr, key) {
    var newArr = [];
    for (var i = 0; i < arr.length; i++) {
        var flag = true;
        for (var j = 0; j < newArr.length; j++) {
            if (arr[i][key] == newArr[j][key]) {
                flag = false;
            }
        }
        if (flag) newArr.push(arr[i]);
    }
    return newArr;
}

方法二:利用reduce来实现

function uniqueArr(arr, key) {
    var hash = {};
    return arr.reduce(function(item, next) {
        hash[next[key]] ? '' : hash[next[key]] = true && item.push(next);
        return item
    }, []);
}

例子:

var arr = [{
        id: '001',
        name: 'Jack'
    },
    {
        id: '002',
        name: 'Eric'
    },
    {
        id: '003',
        name: 'Tom'
    },
    {
        id: '003',
        name: 'Lucy'
    },
    {
        id: '002',
        name: 'Lucy'
    },
    {
        id: '004',
        name: 'Jacky'
    },
]
uniqueArr(arr, 'id');