对象数组去重

针对去重问题,有这么几种解决方式,如Set,for循环遍历属性值等。

问题如下:

// 对象数组去重,只要对象的所有属性值相同,则表示相同对象。
const arr = [{ a: 1, b: 2 },{ b: 2, a: 1 },{ a: 1, b: 2, c: { a: 1, b: 2 } },{ b: 2, a: 1, c: { b: 2, a: 1 } },
];

如果使用Set去重,则不会去掉对象属性顺序不一致的一项,因为对象obj1与 obj2两者所引用的地址不同,js判断为不同的对象。

const newArr = [...new Set(arr)];
obj1 = {a: 1,b: 2
};
obj2 = {b: 2,a: 1
};
console.log('obj === obj2: ', obj === obj2); // false

 使用传统嵌套for循环判断:

const newArr = [...arr];
for (let i = 0; i < newArr.length; i++) {for (let j = i + 1; j < newArr.length; j++) {// 判断条件 newArr[i] === newArr[j]if (JSON.stringify(newArr[i]) === JSON.stringify(newArr[j])) {newArr.splice(j, 1);j--;}}
}

其输出结果也不符合要求,不过我们可以以此为基础,在条件判断上做文章。

代码大体思路实现如下:

const isObject = val => typeof val === 'object' && val != null;
function equals(val1, val2) {if (!isObject(val1) || !isObject(val2)) {return Object.is(val1, val2);}if (val1 === val2) return true;const val1Keys = Object.keys(val1);const val2Keys = Object.keys(val2);if (val1Keys.length != val1Keys.length) return false;for (const key of val1Keys) {if (!val2Keys.includes(key)) return false;const res = equals(val1[key], val2[key]);if (!res) return false; // 只要有一个属性值不一样,返回falseconsole.log('res: ', res);}
}

解释:isObject函数用来判断某个值是否为对象,equals函数用来比较两个值是否相同,包括属性名相同但顺序不同的情况。

Object.is()是ECMAScript 6中的一个新方法,用于比较两个值是否相等,参考MDN。

知识的掌握程度决定了你有多少种选择,每天进步一点点。 

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

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

相关文章

计算机网络---TCP/UDP

TCP/UDP 1、TCP三次握手 四次挥手? TCP是一种面向连接的、可靠的字节流服务。在建立TCP连接时,需要进行三次握手,而在关闭TCP连接时,需要进行四次挥手。具体来说,TCP三次握手的过程如下: 客户端向服务端发送SYN报文,表示请求建立连接。服务端收到SYN报文后,向客户端发…

XXL-JOB源码梳理——一文理清XXL-JOB实现方案

分布式定时任务调度系统 流程分析 一个分布式定时任务&#xff0c;需要具备有以下几点功能&#xff1a; 核心功能&#xff1a;定时调度、任务管理、可观测日志高可用&#xff1a;集群、分片、失败处理高性能&#xff1a;分布式锁扩展功能&#xff1a;可视化运维、多语言、任…

部署并应用ByteTrack实现目标跟踪

尽管YOLOv8已经集成了ByteTrack算法&#xff0c;但在这里我还是想利用ByteTrack官网的代码&#xff0c;自己实现目标跟踪。 要想应用ByteTrack算法&#xff0c;首先就要从ByteTrack官网上下载并安装。虽然官网上介绍得很简单&#xff0c;只需要区区6行代码&#xff0c;但对于国…

【计算机网络笔记八】应用层(五)HTTPS

什么是 HTTPS HTTPS 解决了 HTTP 不安全的问题 HTTP 整个传输过程数据都是明文的&#xff0c;任何人都能够在链路中截获、修改或者伪造请求&#xff0f;响应报文&#xff0c;数据不具有可信性。 ① HTTPS 使用加密算法对报文进行加密&#xff0c;黑客截获了也看不懂 ② HTTP…

Play Beyond:Sui让优秀的游戏变得更好

自问世以来&#xff0c;视频游戏就紧随着文化产业发展。从Pong和Space Invaders的时代到Animal Crossing和Among Us&#xff0c;伟大的游戏总有能力吸引玩家&#xff0c;并推动娱乐产业发展。根据Grand View Research的数据&#xff0c;全球视频游戏市场在2022年估计为2170.6亿…

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前&#xff08;2013年&#xff09;学习CUDA的时候开始总结的知识点&#xff0c;好长时间不写CUDA代码了&#xff0c;现在LLM推理需要重新学习CUDA编程&#xff0c;看来出来混迟早要还的。 1.CUDA 解析&#xff1a;2007年&#xff0c;NVIDIA推出CUDA&#xff08…

java练习 day5

一、Nim 游戏 1、题目链接 点击跳转到题目位置 2、代码 class Solution {public boolean canWinNim(int n) {if(n % 4 0){return false;}return true;} }3、知识点 (1) 通过模拟来寻找 规律。 二、区域和检索 - 数组不可变 1、题目链接 点击跳转到题目位置 2、代码 …

Docker 日志管理 - ELK

Author&#xff1a;rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志&#xff1f;…

.netcore worker service在一个worker里执行多个任务的方法

最近&#xff0c;有一个项目要使用 Windows 服务&#xff0c;来做为一个软件项目的载体。我想了想&#xff0c;都已经到了跨平台的时代了&#xff0c;会不会有替换 Windows 服务的技术出现呢&#xff1f;于是&#xff0c;在网络上疯狂的搜索了一番&#xff0c;真实皇天不负苦心…

图像拼接后丢失数据,转tiff报错rasterfile failed: an unknown

图像拼接后丢失数据 不仅是数据丢失了&#xff0c;还有个未知原因报错 部分数据存在值不存在的情况 原因 处理遥感数据很容易&#xff0c;磁盘爆满了 解决方案 清理一些无用数据&#xff0c;准备买个2T的外接硬盘用着了。 然后重新做处理

redis高可用(主从复制,哨兵,集群)

目录 一、主从复制&#xff1a; 1.主从复制介绍&#xff1a; 2.主从复制的作用&#xff1a; 3.主从复制流程&#xff1a; 4.搭建Redis 主从复制&#xff1a; 4.1 环境准备&#xff1a; 4.2 安装redis&#xff1a; 4.3 master节点修改 Redis 配置文件&#xff1a; 4.4 slave节点…

Linux学习之悟空派上实现OLED的无线网IP及CPU温度显示【守护进程】

起因 最近各种网购平台似乎都在推送99元的悟空派全志H3的开发板&#xff0c;出于好奇就买了一块来试试水&#xff0c;由于这块板子基本上和orangepi-Zero的硬件结构一模一样&#xff0c;所以设备树、boot这些就用orangepi现成的部件了。 因为本人比较喜欢使用SSH操作&#xff…

Java方法案例

设计一个方法用于遍历数组&#xff0c;要求遍历的结果是在一行上的。例如&#xff1a;[11,22,33,44,55] public class index {public static void main(String[] args) {int[] arr {11,22,33,44,55};printArr(arr);}public static void printArr(int[] arr){System.out.print…

C++——list(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年9月28日 内容&#xff1a;C——list内容讲解 目录 前言&#xff1a; list的const迭代器&#xff1a; const的iterator&#xff1a; const迭代器&#xff1a; operator->: 拷贝构造&#xff1a; 迭代器接口补充&…

QT实验之闪烁灯

QT实验之闪烁灯 在QT中&#xff0c;使用QPainter来实现闪烁灯效果的一种方法是使用QTimer来周期性地改变灯的状态。 首先&#xff0c;你需要一个QPixmap对象&#xff0c;它包含了灯的图片。然后&#xff0c;使用QTimer来周期性地切换灯的状态。当灯的状态改变时&#xff0c;你需…

(c语言)位操作符

#include<stdio.h> //位操作符(只针对整数进行操作) //& - 按(二进制)位与 (有0则0) //| - 按(二进制)位或 (有1则1) //^ - 按(二进制)位异或 (不同为1,相同为0) int main() { int a 3; int b -5; //00000000000000000000000000000011——3的补码 …

【408复习】在b站开播通知

从今天开始制作408的讲解课程&#xff0c;欢迎大家来围观&#xff1b; 视频讲解的方式&#xff0c;在b站讲解&#xff0c; 账号&#xff1a;JustinAndCindy 参考书目&#xff1a; 操作系统 《计算机操作系统》第四版 汤小丹 数据结构 《无》 计算机网络 谢希仁 计算机组成原理 …

torch.randn()函数

torch.randn函数是PyTorch中用于生成具有正态分布&#xff08;均值为0&#xff0c;标准差为1&#xff09;的随机数的函数。它可以用于创建具有指定形状的张量&#xff0c;并且张量中的每个元素都是独立的随机数&#xff0c;遵循标准正态分布&#xff08;均值为0&#xff0c;标准…

【LittleXi】【MIT6.S081-2020Fall】Lab: locks

【MIT6.S081-2020Fall】Lab: locks 【MIT6.S081-2020Fall】Lab: locks内存分配实验内存分配实验准备实验目的1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果3. 解释a…

Elasticsearch安装访问

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…