JS中数组去重方法总结

在JavaScript中,数组去重是一个常见的操作,目的是移除数组中的重复元素,确保数组中每个元素都是唯一的。以下是几种常用的数组去重方法,分别适用于不同的情况:

1. 使用 Set 对象

Set 是 ES6 引入的新数据结构,它类似于数组,但其中的每个值都是唯一的。利用这一特性,可以很容易地去重:

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点: 简单、高效,代码简洁。

缺点: 只能处理基本类型(如字符串、数字等),对对象数组的去重不适用。

2. 使用 filterindexOf

filter 方法结合 indexOf 可以实现数组去重。filter 会返回一个满足条件的新数组,indexOf 则返回元素在数组中第一次出现的索引。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((value, index, self) => self.indexOf(value) === index);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点: 对所有类型的数据都有效。

缺点: 性能较低,因为 indexOf 需要在数组中遍历查找元素。

3. 使用 reduce 方法

reduce 是数组的另一个常用方法,可以累积数组的处理结果。通过 reduce 来遍历数组并构建一个新数组,确保每个元素唯一。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((accumulator, currentValue) => {if (!accumulator.includes(currentValue)) {accumulator.push(currentValue);}return accumulator;
}, []);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点: 可以灵活处理各种去重逻辑。

缺点: 相对复杂,性能不如 Set

4. 使用 Map 对象

Map 对象保存键值对,键是唯一的。可以通过使用 Map 来实现数组去重,尤其在对象数组去重时非常有用。

const array = [{ id: 1 }, { id: 2 }, { id: 1 }, { id: 3 }];
const uniqueArray = [...new Map(array.map(item => [item.id, item])).values()];
console.log(uniqueArray); // [{ id: 1 }, { id: 2 }, { id: 3 }]

优点: 对对象数组的去重很有效。

缺点: 代码稍微复杂一点,需要对 Mapvalues() 有一定了解。

5. 使用 forEachObject

可以用 forEach 遍历数组,通过对象的键值对存储元素来实现去重。这种方法也适用于对象数组的去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const seen = {};
const uniqueArray = [];
array.forEach(item => {if (!seen[item]) {seen[item] = true;uniqueArray.push(item);}
});
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点: 灵活,易于理解和使用。

缺点: 需要手动管理键值对,稍显冗长。

总结

  • 最简单、常用的方法:使用 Set,适合大多数去重需求。
  • 复杂数据结构(如对象数组):使用 Map 更灵活有效。
  • 兼容性和性能filterreduce 方法在处理复杂逻辑时更加灵活,但性能不如 Set

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

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

相关文章

编程之路:在Bug的迷宫中寻找出口

编程是一种艺术,也是一种科学。它要求我们既要有创造性的思维,又要有严谨的逻辑。在这条充满挑战的道路上,每个人都会遇到挫折,这些挫折可能来自于一个难以解决的Bug,一个复杂的算法,或者是在实现某个功能时…

云手机解决了TikTok哪些账号运营难题?

随着社交媒体的蓬勃发展,TikTok作为一款风靡全球的短视频应用,成为许多个人和企业进行品牌推广、内容创作的首选平台。然而,随之而来的是TikTok账号运营的一系列难题。本文将深入探讨云手机是如何解决这些难题的。 1、多账号运营的便捷性&…

tomcat实战演练

一.tomcat介绍 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用, Tomcat 具有处理 HTML 页面的功能,它还是一个 Servlet 和 JSP容器。Tomc…

C语言笔试题(指针、数组、整数在内存中的存储、结构体......)

文章目录 1.选择题2.代码题2.1 模拟实现strncat2.2 模拟实现strncpy2.3 编写判断大小端程序2.4 模拟实现atoi2.5 BC38 变种水仙花数2.6 BC98 序列中删除指定数字 今天我们一起来看一些题目 1.选择题 解析如下: 正确选项:B A.参数错误;D.返回…

Prettier+Vscode setting提高前端开发效率

文章目录 前言Prettier第一步:下载依赖(团队合作)或下载插件(独立开发)第二步:添加.prettierrc.json文件**以下是我使用的****配置规则** 第三步:添加.prettierignore文件**以下是我常用的****配…

LabVIEW多显示器环境下主显示器识别与管理

该程序使用 LabVIEW 图形化编程语言,涉及多显示器环境中主显示器的识别与信息提取。图像显示了两个不同的方法来获取主显示器的信息。 第一部分:方法一——基于显示器位置的主显示器识别 1. 当前监视器识别: 使用“FP.Monitor”属性节点获取…

监控易助力合作伙伴成功转型,共创运维监控新篇章

在当今数字化转型的浪潮中,企业的IT运维管理面临着前所未有的挑战。随着业务系统的不断扩展和复杂化,传统的运维监控手段已经难以满足高效、准确、实时的监控需求。这一背景为运维监控市场带来了前所未有的发展机遇,也催生了对创新运维监控解…

plsql表格怎么显示中文 plsql如何导入表格数据

在Oracle数据库开发中,PL/SQL Developer是一款广泛使用的集成开发环境(IDE),它提供了丰富的功能来帮助开发人员高效地进行数据库开发和管理。在使用PL/SQL Developer时,许多用户会遇到表格显示中文的问题,以…

ansible:

ansible: 远程自动化运维 ansible是基于python开发的配置管理和应用部署工具。 也是自动化运维的重要工具。 可以批量配置,部署,管理上千台主机。 只需要在一台主机配置ansible就可以完成其他主机的操作。 操纵模式: 1、模…

EmguCV学习笔记 VB.Net 6.4 霍夫变换

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

ArcGIS Pro基础:如何将数据和引用地图样式一起打包分享

如上所示,有2个矢量图斑,一个是耕地地块,另一个是范围图斑,如果我们需要把此工程的所有数据以及引用地图一起分享给别人,就可以使用【打包工程】这个工具。 如上所示,在【地理处理】下输入【打包工程】&am…

【C语言】常见文件操作

文件的常见操作 #include<stdio.h>// 由于devc代码编码为ANCI&#xff0c;故读取的文件中若有中文&#xff0c;请设置文件编码为ANCI&#xff0c;否则会乱码 // 读文件 void test1() {char ch;FILE *fp; // 创建文件指针fp fopen("./file.txt", "r"…

数据结构系列-归并排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 归并排序 递归版本 首先&#xff0c;我们来看一下归并的示意图&#xff1a; 这是归并排序当中分解的过程。 然后便是两个两个进行排序&#xff0c;组合的过程。 归并完美的诠释…

系统编程-管道

管道 目录 管道 1、管道的特点 2、无名管道的使用步骤 &#xff08;1&#xff09;在进程中使用 pipe 函数来获取管道的文件描述符 &#xff08;2&#xff09;使用 fork 函数来创建子进程 &#xff08;3&#xff09;通过获取到的文件描述符来进行数据的传输 &#xff08…

[论文阅读] mobile aloha实验部分

DP:[1] CHI C, FENG S, DU Y, et al. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion[J]. 2023. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion精读笔记&#xff08;一&#xff09;-CSDN博客 哥伦比亚大学突破性的方法- Diffusio…

【Leetcode 1893 】 检查是否区域内所有整数都被覆盖

给你一个二维整数数组 ranges 和两个整数 left 和 right 。每个 ranges[i] [starti, endi] 表示一个从 starti 到 endi 的 闭区间 。 如果闭区间 [left, right] 内每个整数都被 ranges 中 至少一个 区间覆盖&#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 已…

【SpringBoot】11 多数据源(MyBatis:dynamic-datasource)

介绍 多数据源&#xff1a;指的是一个单一应用程序中涉及了两个及以上的数据库&#xff0c;这种配置允许应用程序根据业务需求灵活地管理和操作不同的数据库。 需求 一个应用服务中&#xff0c;连接多个数据库&#xff0c;有本地的也有远程的&#xff0c;有MysQL、Oracle、P…

前端实现首次访问,后续从本地访问

在前端实现将PDF文件下载到用户的本地磁盘&#xff0c;并在后续加载时使用本地文件&#xff0c;而不是重新从服务器下载&#xff0c;可以通过以下步骤实现&#xff1a; 1. **使用<a>标签的download属性**&#xff1a;当用户首次点击下载PDF时&#xff0c;通过<a>标…

PDPS软件 那智机器人 (丰田版)离线程序导出处理

在PDPS仿真软件中导出的那智机器人离线程序&#xff0c;一般是无法直接给TFD控制装置-那智机器人&#xff08;丰田式样版&#xff09;导入及识别使用。因此要对导出的程序进行转换编译处理&#xff0c;才能给TFD那智机器人&#xff08;丰田式样版&#xff09;导入离线程序。以下…

C语言宏的深度探索与全面应用策略

C语言的宏机制是一种预处理器功能&#xff0c;它允许程序员在编译阶段进行文本替换&#xff0c;以实现代码的复用、条件编译和性能优化等目标。然而&#xff0c;宏的使用也伴随着一些挑战&#xff0c;如可能导致代码难以理解和维护、引入未预期的行为等。本文旨在深入剖析C语言…