• 【原】js数组对象去重最简单的方法


    简单的数组去重是比较简单的,方法也特别多,如给下面的数组去重:

    let arr = [1,2,2,4,9,6,7,5,2,3,5,6,5]

    最常用的可以用for循环套for循环,再用splice删除重复的数组:

    let arrUnique = function (arr){            
            for(let i=0; i<arr.length; i++){
                for(let j=i+1; j<arr.length; j++){
                    if(arr[i]==arr[j]){ //第一个等同于第二个,splice方法删除第二个
                        arr.splice(j,1);
                        j--;
                    }
                }
            }
    return arr;
    }

    然而数组的子集为对象时,一般不使用多个for循环来去重,如下面的数组对象:

    let arr = [
        {
            mch_id:'ghx1',
            status: 1,
            type: 2
        },
        {
            mch_id:'awx2',
            status: 2,
            type: 3
        },
        {
            mch_id:'ghx1',
            status: 1,
            type: 2
        },
        {
            status: 1,
            type: 2,
            mch_id:'ghx1'
        }
    ]

    通过观察,我们可以发现该数组中的第1、3、4项其实是一样的,最初在谷歌找了几个方法最终都不太满意,比如会改变数组中对象原来的排序、数组去重失败等,后来经过多次尝试和实践,得出以下最简单的方法:

    1. 利用对象的键名无法重复的特点,我们可以新建一个临时对象来存储原数组中的对象子集的值,比如我的项目中mch_id是唯一的ID,然后设置的它为临时对象的键名,值为true即可,保证它的唯一性
    2. 通过判断对象的键名是唯一时,把对应的数组值添加到一个空数组中,最终得到一个去重后的数组对象
    3. 此方法不会改变数组对象原有的排序
    let arrUnique = function(arr){
        let result = {};
        let finalResult=[];
        for(let i=0;i<arr.length;i++){
            //利用对象的键名无法重复的特点,cpmch_id是唯一区别的属性值
            result[arr[i].mch_id] ? '' : result[arr[i].mch_id] = true && finalResult.push(arr[i]);
        }
        return finalResult;
    }

    或者利用ES5数组方法reduce

    let arrUnique = function(arr){
        let ojb = {};
        arr = arr.reduce(function(prevArr, currentItem) {
            //利用对象的键名无法重复的特点,mch_id是唯一区别的属性值
            ojb[currentItem.mch_id] ? '' : ojb[currentItem.mch_id] = true && prevArr.push(currentItem);
            return prevArr
        }, [])
        return arr;
    }

     提前祝大家劳动节快乐

  • 相关阅读:
    PerfDog携手Imagination,助力开发者获取GPU关键数据
    WeTest云手机升级,支持iOS 15全新系统
    洞穿性能测试痛点,PerfDog以提升应用和游戏的品质为使命
    使用xmlhttprequest遇到CORS报错的处理
    Hive的联级(cascade)-新增字段(column)后,旧分区无法更新数据问题
    数据异常检测入门
    Linux查看文件或文件夹大小: du命令
    k8s pod自动重启原因(jvm内存设置)
    计算容器运行至今多长时间
    期刊论文在线投稿审稿系统day1数据库设计
  • 原文地址:https://www.cnblogs.com/PeunZhang/p/10773351.html
Copyright © 2020-2023  润新知