分享6个对象数组去重的方法

news2025/1/12 0:03:16

3a9b03b453c44a537729075fe9247d46.jpeg

大家好,关于对象数组去重的业务场景,想必大家都遇到过类似的需求吧,针对这样的需求,你是怎么做的呢。

下面我就先和大家讨论下基于对象的某个属性如何去重。

方法一:使用 .filter() 和 .findIndex() 相结合的方法

使用 filter() 方法过滤掉重复的元素,使用 findIndex() 方法判断对象是否重复,代码如下:

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
             {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = arr.filter((item, index) =>
     arr.findIndex(i => i.id === item.id) === index);

方法二:使用 .reduce() 方法

使用 reduce() 方法维护一个累加器,通过对象的属性来判断是否重复,代码如下:

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
             {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = arr.reduce((acc, curr) => {
  if (!acc.find(item => item.id === curr.id)) {
    acc.push(curr);
  }
  return acc;
}, []);

方法三:使用 .forEach() 和 .some() 相结合的方法

使用 forEach() 方法遍历数组,使用 some() 方法判断是否重复,代码如下:

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
             {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = [];
arr.forEach(item => {
  if (!uniqueArr.some(i => i.id === item.id)) {
    uniqueArr.push(item);
  }
});

方法四:使用 Map

使用 Map 结构去重对象数组时,需要借助 array.map() 函数将对象数组进行转换,示例代码如下:

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
             {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = [...new Map(arr.map(item => [item.id, item])).values()];

方法五:Object.create()

使用Object.create(),按照对象的属性来判断是否重复,代码如下

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
             {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = arr.filter(function (item) {
    return !this[item.id] && (this[item.id] = true);
}, Object.create(null));

方法六:For const of 和 find 结合

这个方法的思想与方法3类似 ,其思路结构如下:

  • 创建一个空的唯一数组来存储唯一对象。

  • 循环遍历数组中的对象。对于每个对象,如果它不是重复的,则将其添加到唯一数组。否则,忽略它

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
  {id: 1, name: "c"}, {id: 3, name: "d"}];
const unique = [];
for (const item of arr) {
  const isDuplicate = unique.find((obj) => obj.id === item.id);
  if (!isDuplicate) {
    unique.push(item);
  }
}

针对多个属性进行去重

有时候,您可能希望仅当对象具有两个或多个具有相同值的属性时才将其视为重复对象——多个属性值相同。

对于这种情况,我们可以将上述方法进行稍微调整就可以进行使用,有部分方法可能不适用,有哪些不合适,这个问题留给大家,欢迎大家在评论区讨论。

我们先使用 .filter() 和 .findIndex() 相结合的方法尝试下,看看如何操作:

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
             {id: 1, name: "a"}, {id: 3, name: "d"}];
const uniqueArr = arr.filter((item, index) =>
                             arr.findIndex(i => i.id === item.id
                                && i.name === item.name) === index);

我们再使用 For const of 和 find 结合的方法,也能实现同样的效果

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
  {id: 1, name: "a"}, {id: 3, name: "d"}];
const unique = [];
for (const item of arr) {
  const isDuplicate = unique.find((obj) =>
    obj.id === item.id && obj.name ==item.name);
  if (!isDuplicate) {
    unique.push(item);
  }
}
console.log(unique)

结束

其他几个方法的改造,欢迎大家作为练习进行尝试,这里就不再一一举例了,今天的分享就到这里,这些方法都可以实现对象数组的去重,具体使用哪种方法取决于个人的喜好和项目的需求,如果你有其他的方法,欢迎大家在评论区补充,感谢你的关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AD Event日志监测AdminSDHolder

01、简介 AdminSDHolder是一个特殊的AD容器,通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和组,以防止意外和无意的修改并确保对这些对象的访问是安全的。如果攻击者能完全…

## Leetcode刷题Day24-------------------回溯算法

Leetcode刷题Day24-------------------回溯算法 1. 理论基础 题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html视频讲解:https://www.bilibili.com/video/BV1cy4y167mM …

Linux文件目录与路径、内容查找命令及文件颜色知识总结

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java案例分…

SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务需求Shiro也都能胜任. 二.项目环境 MyBatis-Plus版本: 3.1.0 SpringBoot版本:2.1.5 JDK版本:1.8 Shiro版本:1.4…

ASUS X415安装系统找不到硬盘解决办法

同事让我帮忙安装系统,笔记本电脑型号是ASUS X415。原本以为是手到擒来的事情,结果我在上面还是消耗了不少时间。 现象 老毛桃PE 无法识别到硬盘。微PE可以识别到硬盘,但是系统安装以后,无法正常启动。启动出现蓝屏。或者无限等…

codewars闯关玩耍1

codewars闯关玩耍1 codewars网址:https://www.codewars.com/dashboard 大一时在知乎上看到的网站,然后 点击、收藏、吃灰 一键三连,最近翻收藏夹的时候突然又看见了决定进来玩玩,练练英语,巩固下python 以后此系列&a…

javaweb10 JSP语法、JSTL、EL表达式、JSP标签、九大内置对象

文章目录一、JSP简介二、JSP原理三、JSP语法四、JSP指令五、九大内置对象六、EL表达式七、JSP标签八、JSTL标签一、JSP简介 JSP(java sever pages):java服务器端页面,和servlet一样,用于动态web技术 写JSP就像在写HTM…

中国to B应用软件的突破之路

我曾经随手画过一个很简单的图:我就分为供需两端。(1)如何让生意越做越大?那就在需侧,增加尽量多的交互。有人理解在营销环节-客户关系触点经营,有人理解在销售环节-多渠道多业态销售(如电话销售…

振弦采集模块配置工具VMTool生成寄存器值

振弦采集模块配置工具VMTool生成寄存器值 生成寄存器值 VMXXX 有很多按位使用的寄存器, 使用 VMTool 工具可进行方便的设置,当需要知道寄存器的实际值时,可通过以下两种方法获取。 (保持【 自动读取】 复选框为非选中状态&#xf…

Unity 简易音乐播放系统

前言 众所周知, Unity自带音效播放没有回调,不能自动播放clip列表; 所以简单实现一个带自动播放功能的接口,用以实现音乐列表的逐个播放. 一. 功能分析 首先要求切换场景时音乐不停,只在需要时播放其次即传入音乐名和播放次数,即可将该音乐循环播放指定次数可以直接传入一个…

【OpenCV 例程 300篇】256. 特征检测之 CenSurE(StarDetector)算法

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】256. 特征检测之 CenSurE(StarDetector)算法 6.9.1 算法简介 中心环绕算法(Center Surround Extremas, CenSurE)是 Agrawal M 等于 2008年提出的关键…

K8S StatefulSet基本使用

K8S StatefulSet 清空K8S对象 为了避免之前学习的内容造成的影响,先手动把K8S集群中的所有对象清空,使用一个全新的环境来学习StatefulSet的基本使用。 查看对象 查看service对象 kubectl get services查看ReplicaSet对象 kubectl get rs查看Repli…

达梦数据库导入dmp文件

找到达梦数据库安装文件的bin目录按着Shift键,右键输入以下命令(注意更改参数).\dimp DGYH(用户名)/DGYH(密码)127.0.0.1 FILEdmp所在文件夹路径\20230103.dmp fullY然后根据提示,写Y 或 N 回车即可注意:若导入成功,但…

Java9的新特性模块化(Module)

一、 模块化是什么? Java 9引入了模块化系统,称为"Java Platform Module System"(JPMS) 这个系统允许将Java程序分成模块,每个模块都有自己的规范,可以明确地声明它依赖于哪些其他模块&#xff…

小波分析在电力系统暂态信号处理中的应用

前面我们主要讲了小波分析在机械振动信号或者其他时间序列中的应用 基于小波包特征提取和随机森林的CWRU轴承数据集故障识别 - 哥廷根数学学派的文章 - 知乎 https://zhuanlan.zhihu.com/p/556172942 基于小波区间相关(Interval-Dependent)的信号降噪方…

nacos源码分析-心跳检测(服务端)

前言 前面我们讲了《nacos源码分析-服务注册(客户端)》 和 《nacos源码分析-服务注册(服务端)》,主要是讲的服务注册流程,本章节我们来讲服务心跳检测机制。 心跳续约客户端 其实我们在讲 nacos服务注册客户端的时候顺带就说了心跳,服务注…

iNav飞控AOCODARC-F7MINI固件编译

iNav飞控AOCODARC-F7MINI固件编译1. 编译目标(AOCODARC-F7MINI)2. 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4 厂家目标板查询Step 5 目标固件编译Step 6 目标固件清理3. 参考资料iNav是一款非常出色的飞控航模开源软…

怎么恢复360删除的文件?360文件恢复,快速完成

日常生活和工作中,使用电脑总会保存着很多数据。其中有我们很多的文件,如果不小心删除了重要的文件,我们该怎么恢复呢? 很多人都喜欢在电脑上安装3 60安 全卫士,文件被误删,我们可以通过它来恢复数据。文件…

来看看我在CSDN上的好朋友们吧,看看有没有你

首先,感谢支持我的所有人,其次,感谢支持我的所有人,然后感谢支持我的所有人,最后,感谢支持我的所有人(我这是废话吗???不是吧) 今天就来看看我在…