• JavaScript数组去重的7种方式


    1.利用额外数组
    function unique(array{
        if (!Array.isArray(array)) return;

        let newArray = [];
        for(let i=0, len=array.length; i<len; i++) {
            let itemAtIndex = array[i];
            if (!newArray.includes(itemAtIndex)) { // newArray.indexOf(itemAtIndex) === -1
                newArray.push(itemAtIndex);
            }
        }

        return newArray;
    }
    2.indexOf与lastIndexOf
    function unique(array{
        if (!Array.isArray(array)) return;

        for(let i=0; i<array.length; i++) {
            let itemAtIndex = array[i];
            if (array.indexOf(itemAtIndex) !== array.lastIndexOf(itemAtIndex)) {
                array.splice(i, 1);
                i--; // array 与 array.length change
            }
        }

        return array; // 顺序可能会改变
    }

    注: 利用额外数组配合indexOf与lastIndexOf 取出未重复出现的元素

    function unique(array{
        if (!Array.isArray(array)) return;

        let newArray = [];
        for(let i=0, len=array.length; i<len; i++) {
            let itemAtIndex = array[i];
            if (array.indexOf(itemAtIndex) === array.lastIndexOf(itemAtIndex)) {
                newArray.push(itemAtIndex);
            }
        }

        return newArray;
    }
    3.filter
    function unique(arr{
        return arr.filter(function(item, index, arr{
          // 取出元素, 该元素在数组中第一次出现的索引 === 当前索引值
          return arr.indexOf(item, 0) === index;
        });
    }
    4.双层for循环
    function unique(array{
        if (!Array.isArray(array)) return;

        for(var i=0; i<array.length; i++) {

            for(var j=i+1; j<array.length; j++) {
                if (array[j] === array[i]) {
                    array.splice(j, 1);
                    j--; // array 与 array.length change
                }
            }

        }

        return array;
    }
    5.利用sort排序后, 相邻元素不相等
    function unique(array{
        if(!Array.isArray(array)) return;

        array.sort();
        for (let i=0; i<array.length; i++) {
            if (i <= array.length-2) {
                if (array[i+1] === array[i]) {
                    array.splice(i+11);
                    i--; // array 与 array.length change
                }
            }
        }

        return array; // 顺序可能会改变
    }
    6.利用对象key唯一的特性(这个方法还能标记出重复元素的数量); 另, map原理与object一致
    function unique(array{
        if (!Array.isArray(array)) return;

        let obj = {};
        for(let i=0, len=array.length; i<len; i++) {
            let itemAtIndex = array[i];
            obj[itemAtIndex] = '';
        }

        let newArray = [];
        for(let key in obj) {
            newArray.push(Number(key));
        }

        return newArray; // 顺序可能会改变
    }
    7.利用ES6 set
    function unique(array{
        if (!Array.isArray(array)) return;
        return Array.from(new Set(array)); // [...new Set(array)] 
    }

    测试函数及测试用例

    function ensureEqual(a, b, message{
        if (JSON.stringify(a) !== JSON.stringify(b)) {
            console.log(`***测试失败, ${JSON.stringify(a)} 不等于 ${JSON.stringify(b)}${message}`);
        }
    };

    ensureEqual(unique([1,2,3,3,4,4,5,5,6,1,9,3,25,4]), [1,2,3,4,5,6,9,25], 'test1');

    以上就是JavaScript数组去重的较为常规的方式;其中,第3种比较不容易想到;另,由于业务中一般处理的都是相同类型的数据,因此这里数组里的数据统一为数值类型,并未做混合类型的考虑。

  • 相关阅读:
    Lesson 43-44 Vacation Season is Approaching?
    Lesson 41-42 How would you respond?
    Lesson 37-38 Do you want to be a millionaire?
    Lesson 35-36 What did you forget?
    Lesson 33-34 Dieting
    保送
    陈老师搬书
    水题(原 USACO Mother's Milk)
    最大公约数和最小公倍数问题(luogu 1029)
    最大子矩阵(OJ 1768)
  • 原文地址:https://www.cnblogs.com/rencoo/p/11828329.html
Copyright © 2020-2023  润新知