【原】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;
}
复制代码

 提前祝大家劳动节快乐

posted @   白树  阅读(7905)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2014-04-26 【原】移动web动画设计的一点心得——css3实现跑步
点击右上角即可分享
微信分享提示