JS小技巧,如何去重对象数组?

news2024/11/29 4:50:20

关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。

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

使用 Array.prototype.filter() 和 Array.prototype.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/1286311.html

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

相关文章

友菜友饭携手分众传媒,打造私厨到家生活新风尚

友菜友饭携手分众传媒 11月29日,友菜友饭与分众传媒签署战略合作协议,在全国重点城市全面引爆品牌力,携手打造全国领先的互联网数字化私厨平台,为中国5亿城市家庭解锁私厨到家服务新体验。 友菜友饭是全国领先的私厨到家平台&…

uniapp到底用什么ui框架最合适-关于uni-app的ui库、ui框架、ui组件

文章目录 直接看答案关于uni-app的ui库、ui框架、ui组件组件的概念扩展组件的选择uni ui如何使用uni ui 综上,官方对组件的使用建议是:附录:其他全端兼容ui库参考文章: 直接看答案 如果想自己纯手写,直接用内置组件。…

客户案例:SMC2威胁感知升级,保障金融行业邮件安全

客户背景 某基金公司是一家在业界享有广泛声誉的综合型资产管理公司,总部位于广州,在北京、上海、香港等地区均设有公司,业务范围遍布全球,凭借其卓越的投资业绩和专业的基金管理服务,赢得了广大投资者的高度认可。 该…

文献速递:多模态影像组学文献分享(基于多模式超声的临床放射学诺莫图,用于预测实质性低回声乳腺病变的恶性风险)

文献速递:多模态影像组学文献分享:(基于多模式超声的临床放射学诺莫图,用于预测实质性低回声乳腺病变的恶性风险) 01 文献速递介绍 作为世界上最常见的癌症,乳腺癌对人们的健康和生存构成了严重威胁(1)。鉴于其高转…

智慧物联可视化大屏赋能设备管理和城市运行

在智慧物联的时代,万物互联的网络正在构筑起一个智能化的世界。无论是家居设备、汽车、还是工业设备,都能通过互联网实现智能化管理和控制。随着物联网技术的发展,我们迅速步入了一个千姿百态的智慧时代。智慧物联逐渐渗透进我们的日常生活&a…

【银行测试】第三方支付功能测试点+贷款常问面试题(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、第三方支付功能…

Linux快速配置拨号

在Linux上进行ADSL拨号配置,通常需要使用pppoeconf命令进行设置。pppoeconf是一个用于配置pppoe连接的工具,它可以帮助用户快速设置pppoe连接并生成配置文件。下面是一个详细的步骤指南,以帮助您在Linux上进行ADSL拨号配置。 步骤1&#xff…

windows下安装配置kafka

一、安装zookeeper 在使用Kafka之前,通常需要先安装和配置ZooKeeper。ZooKeeper是Kafka的依赖项之一,它用于协调和管理Kafka集群的状态。 ZooKeeper是一个开源的分布式协调服务,它提供了可靠的数据存储和协调机制,用于协调分布式…

java easyPOI导出一对多数据,设置边框,字体,字体大小

java easyPOI导出一对多数据,设置边框,字体,字体大小 需求总是千奇百怪,解决的方式也可以是多种多样。 今天碰到导出excel是一对多结构的,以往导出的数据都是一条一条的,所以采用的是比较方便简单的方法eas…

Stable Diffusion WebUI训练Lora测试XYZ显示例图

方式一 1.1 选择模型放入目录 将模型放入sd项目的models\Lora\目录,尽量保持和其他模型分开。 sd中显示如下: 1.2 脚本X/Y/Zplot选择 X轴类型:提示词搜索/替换 X轴值:NUM,000001,000002, 000003, 000004, 000005, 000006, 000007, 000008, 000009, 000010 Y轴类型:提…

CSS、JS文件无法正确加载至页面问题与解决

目录 1. 问题出现 2. 分析与解决 3. 总结 1. 问题出现 自己在写项目是时候,想启动浏览器查询首页面index.jsp的显示效果 预期效果应该是下面这样的: 但是实际上是这样的: 意思也就是说可能是关于CSS、JS相关的引入方面出了问题&#xff…

Mysql学习查缺补漏----02 mysql之DCL 数据控制语言

查看数据库里都有哪些用户。 使用root任何一个用户都可以登录。 本机登录。 也可以这样登录其他的机器。 、 修改user表。 刷新权限: 现在我们看到了只有本机才能登陆。 我们这样就可以限制这个mysql指定某台服务器登录。 详解忘记密码以及如何修改用户密码 我们…

ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译

ROS2的功能包、依赖管理、工作空间配置与编译 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyrigh…

Helplook VS Google Docs:一对一比较

还记得Google Docs在2006年一炮走红的时候吗?它很大程度地改变了协作方式,也减少了附加文件和频繁保存的麻烦。相比Microsoft Word,很多人更喜欢Google Docs的简单性。 但是时代也在不断地发展。像HelpLook这样的新竞争对手也可以提供先进的…

Android MVVM+coroutine+retrofit+flow+hilt

文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构: 依赖注入层 数据库: Module InstallIn(SingletonComponent::class) class DBModule {Singleto…

springboot -事务管理

事务 概念 事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。 操作 开启事务: start transaction / begin提交事务:commit回滚事务: rollback 注解 Transactional …

网卡bonding绑定

目录 一、概念 1、概述: 二、实验 1、绑定案例: 一、概念 1、概述: 将多个物理网卡进行排列组合,形成逻辑网卡,网卡的高可用 绑定模式 mode0(平衡负载模式):平时两块网卡均工…

Hadoop学习笔记(HDP)-Part.18 安装Flink

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

作业12.5

1.定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std; class Animal { private:int weight; public:Animal(){}Animal(int weight):weight(weight){}virtual …

《形式语言与自动机理论(第4版)》笔记(二)

文章目录 [toc]前导《形式语言与自动机理论&#xff08;第4版&#xff09;》笔记&#xff08;一&#xff09; 第三章&#xff1a;有穷状态自动机3.1|语言的识别3.2|有穷状态自动机即时描述 s e t ( ) set() set()例题问题 1 1 1解答问题 2 2 2解答 3.3|不确定的有穷状态自动机构…