数组对象根据关键id去重

news/2024/11/17 12:56:47/
        const objArr = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Carol' },{ id: 3, name: 'Dave' },{ id: 2, name: 'Eve' }];

数组根据关键id去重得到结果为

        [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Carol' },];

数组对象根据关键id去重

  • 一、循环遍历
  • 二、Set数据结构
  • 三、使用reduce
  • 四、使用filter

一、循环遍历

        const objArr = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Carol' },{ id: 3, name: 'Dave' },{ id: 2, name: 'Eve' }];const uniqueObjArr = [];const idMap = {};objArr.forEach(item => {if (!idMap[item.id]) {idMap[item.id] = true;uniqueObjArr.push(item);}});console.log(uniqueObjArr);

思路:
1.定义一个新数组uniqueObjArr用于保存去重后的对象数组,定义一个对象idMap来记录每个id是否出现过。
2.使用forEach方法遍历原数组objArr,对于每一个对象item,如果idMap中没有记录该对象的id,则将该对象添加到uniqueObjArr中,并将idMap中该id的值设置为true。
注意:这种方法只能去重对象中的id属性,如果有不同的对象拥有相同的非id属性,也会被认为是不同的对象。

二、Set数据结构

        const objArr = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Carol' },{ id: 3, name: 'Dave' },{ id: 2, name: 'Eve' }];const uniqueObjArr = Array.from(new Set(objArr.map(item => item.id))).map(id => {return objArr.find(item => item.id === id);});console.log(uniqueObjArr);

思路:
1.使用map方法将objArr中的对象映射为只包含id属性的数组。
2.使用Set数据结构来对这个数组进行去重,得到一个只包含唯一id的数组。
3.使用map方法,根据这个唯一id的数组,从objArr中找到对应的对象,得到去重后的对象数组uniqueObjArr。
注意:这种方法是对所有的属性进行去重,而不是对特定的id属性进行去重,因此如果有不同的对象拥有相同的非id属性,也会被去重。如果需要根据某个特定的属性进行去重,可以在map方法中只取这个属性,并在find方法中使用这个属性进行比较。

三、使用reduce

        const objArr = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Carol' },{ id: 3, name: 'Dave' },{ id: 2, name: 'Eve' }];const uniqueObjArr = objArr.reduce((prev, item) => {const index = prev.findIndex(obj => obj.id === item.id);if (index === -1) {prev.push(item);}return prev;}, []);console.log(uniqueObjArr);

在reduce方法内部遍历原数组,对于每一个对象item,使用数组的findIndex方法查找新数组中是否存在相同id的对象,如果不存在,就将其添加到新数组中。
注意:由于每次循环会调用findIndex方法,时间复杂度较高,特别是在数组很大的情况下,可能会影响性能。

四、使用filter

        const objArr = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Carol' },{ id: 3, name: 'Dave' },{ id: 2, name: 'Eve' }];const uniqueObjArr = objArr.filter((item, index, arr) => {const firstIndex = arr.findIndex(obj => obj.id === item.id);return firstIndex === index;});console.log(uniqueObjArr);

在filter方法内部遍历原数组,使用一个对象来记录每个id第一次出现的位置,然后根据这个位置进行过滤,得到去重后的数组。
这种方法的好处是不需要自己定义新数组,会返回一个新数组。
注意:由于每次循环会调用findIndex方法,时间复杂度较高,特别是在数组很大的情况下,可能会影响性能。


http://www.ppmy.cn/news/42830.html

相关文章

C语言中常见数据类型和对应内存空间大小

C语言的数据类型是指变量所能存储的数据范围和格式的类型。C语言提供了以下几种基本的数据类型: int类型:int类型用于存储整数(正数、负数、零)。它可以有不同的位数,例如int类型可以是16位、32位或64位。通常情况下&a…

方法覆盖与重载

方法的覆盖 (1)方法的覆盖是子类和父类之间的关系,是垂直关系,解决子类继承父类之后,可能父类的某一个方法不满足子类的具体特征,此时需要重新在子类中定义该方法,并重写方法体。 &#xff08…

2020年 团体程序设计天梯赛——题解集

Hello各位童学大家好!😊😊,茫茫题海你我相遇即是缘分呐,或许日复一日的刷题已经让你感到疲惫甚至厌倦了,但是我们真的真的已经达到了我们自身极限了吗?少一点自我感动,没有结果前别太…

pytorch搭建ResNet50实现鸟类识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章地址: 365天深度学习训练营-第J1周:ResNet-50算法实战与解析 🍖 作者:K同学啊 理论知识储备 深度残差网络ResNet(dee…

直播|StarRocks 3.0 极速统一的湖仓新范式

近期,StarRocks V3.0 RC 版本发布。自此,StarRocks 开启了从 OLAP 到 Lakehouse 演进的新篇章。 全新升级的 StarRocks 3.0: 通过存算分离架构,帮助用户降低存储成本、提升计算弹性 通过数据湖分析、物化视图等特性简化湖仓融合…

Flutter Web 开发实践与优化

一,Flutter Web架构 目前,除了可以支持Android、iOS移动跨平台开发之外,Flutter还支持macOS、Windows、Linux和Web等多个跨平台的开发。可以说,作为一款先进的跨平台开发框架,Flutter已经真正意义上实现了“一次编写,处处运行”的美好愿景。 众所周知,Dart 语言存在之…

大模型“云上经济”之权力游戏

文丨谭婧光阴者百代之过客。世人皆过客,软件亦如此。人工智能已有新旧之分。网友戏称,新人工智能是ChatGPT,旧人工智能是“之前那些”。历史在重演。云计算在美国问世的时候,否定论调居多。一个常见的否定论调是「做生意不用上云」…

Vite详解

目录前言一、Vite简介1. Vite组成2.为什么选 Vite?二、Vite的优缺点1.vite优点2.vite缺点三、使用Vite创建Vue3项目1. 创建 vite 的项目2.项目的结构前言 构建工具 Vite,目前只有vue3才可以使用Vite,如果本文对你有所帮助请三连支持博主。 一、Vite简…