当前位置: 首页 > news >正文

JS 数组去重 — 各类场景适合方法大全

JS 数组去重 — 各类场景适合方法大全

本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全

在这里插入图片描述

文章目录

      • JS 数组去重 — 各类场景适合方法大全
    • 一、基础篇:简单直观的去重方法
      • 1. 使用Set数据结构
      • 2. 利用filter和indexOf方法
      • 3. reduce方法的应用
    • 二、进阶篇:性能与效率的优化
      • 4. 优化后的Set方法
      • 5. 对象键值对的巧妙利用
    • 三、实战篇:常用与特殊需求的解决方案
      • 6. 结合Map和Set的强大功能
      • 7. Lodash库的uniq方法
      • 8. 支持终止条件的去重方法
      • 9. 异步场景下的数据去重
      • 10. 更复杂的去重逻辑:自定义比较函数

在这里插入图片描述

一、基础篇:简单直观的去重方法

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. 利用filter和indexOf方法

filter方法能够创建一个新数组,其包含通过所提供函数实现的测试的所有元素。结合indexOf方法,我们可以检查每个元素在数组中的首次出现位置,从而实现去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

3. reduce方法的应用

reduce方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。通过累积器acc和当前值current的比较,我们可以实现去重逻辑。

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

二、进阶篇:性能与效率的优化

4. 优化后的Set方法

对于大数据集,直接使用Set进行去重通常是最优选择。Set内部使用了哈希表来存储值,因此查找和插入的时间复杂度接近O(1),性能表现优异。

// 生成大量重复数据
const array = Array.from({ length: 1000000 }, (_, i) => i % 1000);
const uniqueArray = [...new Set(array)];
console.log(uniqueArray.length); // 输出: 1000

5. 对象键值对的巧妙利用

对象的键值对具有唯一性,这一特性可以被用来实现数据去重。通过将数组元素作为对象的键,我们可以快速去重并保留元素的顺序。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueObj = {};
array.forEach(item => uniqueObj[item] = true);
const uniqueArray = Object.keys(uniqueObj).map(Number); // 转换键回数字类型
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

三、实战篇:常用与特殊需求的解决方案

6. 结合Map和Set的强大功能

Map能够保持插入顺序,而Set则确保值的唯一性。通过将两者结合,我们可以实现既保持顺序又去重的目标。

const array = [1, 2, 2, 3, 4, 4, 5, {a: 1}, {a: 1}];
const uniqueArray = Array.from(new Map(array.map(item => [JSON.stringify(item), item])).values());
console.log(uniqueArray); // 输出包含唯一对象的数组

7. Lodash库的uniq方法

Lodash是一个一致性、模块化、高性能的JavaScript实用工具库。它提供了丰富的API,其中uniq方法就是用于数组去重的利器。

const _ = require('lodash');
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = _.uniq(array);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

8. 支持终止条件的去重方法

在某些特定场景下,我们可能需要在满足特定条件时终止去重操作。这时,我们可以使用for循环结合break语句来实现。

const array = [1, 2, 2, 3, 4, 4, 5, 'stop', 6];
const uniqueArray = [];
const stopValue = 'stop';
for (let i = 0; i < array.length; i++) {if (array[i] === stopValue) break;if (!uniqueArray.includes(array[i])) uniqueArray.push(array[i]);
}
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

9. 异步场景下的数据去重

在前端开发中,异步操作是家常便饭。当处理异步获取的数据时,我们同样需要确保数据的唯一性。这时,Promise和async/await就派上了用场。

const fetchData = async () => {const urls = ['url1', 'url2', 'url2', 'url3']; // 假设这些URL返回不同的数据const uniqueUrls = [...new Set(urls)];const fetchPromises = uniqueUrls.map(url => fetch(url).then(response => response.json()));const results = await Promise.all(fetchPromises);console.log(results); // 输出每个URL的响应数据
};
fetchData();

10. 更复杂的去重逻辑:自定义比较函数

在某些情况下,我们可能需要根据更复杂的逻辑来判断元素的唯一性。这时,我们可以编写自定义的比较函数来实现去重。

const array = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 2, name: 'Bob' }, // 重复元素{ id: 3, name: 'Charlie' }
];const uniqueArray = array.filter((item, index, self) => {return self.findIndex(el => el.id === item.id) === index;
});console.log(uniqueArray); // 输出根据id去重后的数组

通过以上10种JavaScript前端数据去重方式的详细讲解和代码案例,相信你已经掌握了多种数据去重的技巧。在实际项目中,你可以根据具体需求和性能要求选择合适的方法。希望这篇文章能够对你的前端开发之旅提供有益的帮助。如果你有任何疑问或想要分享你的经验,欢迎在评论区留言交流!

看到这里的小伙伴,欢迎点赞、评论,收藏!

相关文章:

JS 数组去重 — 各类场景适合方法大全

JS 数组去重 — 各类场景适合方法大全 本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全 文章目录 JS 数组去重 — 各类场景适合方法大全 一、基础篇&#xff1a;简单直观的去重方法1. 使用Set数据结构2. 利用filter和indexOf方法3. reduce方法的应用 二、进阶…...

【Java 问题】集合——List

List 1.说说有哪些常见集合&#xff1f;2.ArrayList和LinkedList有什么区别&#xff1f;3.ArrayList的扩容机制了解吗&#xff1f;4.ArrayList怎么序列化的知道吗&#xff1f; 为什么用transient修饰数组&#xff1f;5.快速失败(fail-fast)和安全失败(fail-safe)了解吗&#xf…...

xss 跨站脚本攻击

XSS 的全称是 Cross-Site Scripting&#xff08;跨站脚本攻击&#xff09;。是一种常见的web安全漏洞。 1. XSS 的定义 XSS 是一种注入类型的攻击&#xff0c;攻击者将恶意脚本注入到受信任的网站中。当其他用户访问该网站时&#xff0c;这些脚本会在用户的浏览器中执行。 2…...

5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类

文章目录 一、toString()1. 优缺点2. 使用方法举例① Dos类里更省事的方法 ② Application里 二、构造方法1. 导入2. 什么是构造方法3. 怎么写构造方法① 无参的构造方法(无参构造器)② 有参的构造方法(有参构造器)③ 注意 4. 构造方法的重载 三、再探this1. 给成员变量用2. 给…...

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…...

【UI】将 naive ui 的 message 封装进axios 中,关于naiveui的message相关的用法

文章目录 前言在setup外进行使用直接包裹使用vue 单文件中使用 参考文章&#xff1a; 关于naiveui的message相关的用法 前言 最近新建了一个vite vu3 的项目&#xff0c;完全是从0 到1 &#xff0c;封装到request 的时候 想对axios 请求做一个全局的处理&#xff0c;但发现…...

IC卡批量加密快速写入

我们常用的非接触式IC卡&#xff0c;简称M1卡&#xff0c;他有16个扇区&#xff0c;每个扇区有A密码和B密码 对数据的读写是要验证密码的&#xff0c;因此卡片正式使用前&#xff0c;需要把卡片密码改成需要的密码&#xff0c;系统才可以识别 由于一次加密卡片数量比较大&#…...

软件测试学习笔记丨tcpdump 与 wireshark

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32333 一、抓包分析TCP协议 1.1 简介 TCP协议是在传输层中&#xff0c;一种面向连接的、可靠的、基于字节流的传输层通信协议。 1.2 环境准备 对接口测试工具进行分类&#xff1a; 网络嗅…...

Redis:分布式 - 哨兵

Redis&#xff1a;分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模…...

开源城市运动预约的工具类小程序源码

运动场馆预约小程序是一款主要针对城市运动预约的工具类程序&#xff0c; 产品主要服务人群为20-45岁运动爱好者&#xff0c; 程序前后端完整代码&#xff0c;包括场馆动态&#xff0c;运动常识&#xff0c;羽毛球场地预约&#xff0c;足球场地预约&#xff0c;篮球场地预约&a…...

SldWorks问题 2. 矩阵相关接口使用上的失误

问题 在计算三维点在图纸&#xff08;DrawingDoc&#xff09;中的位置时&#xff0c;就是算不对&#xff0c;明明就4、5行代码&#xff0c;怎么看都是很“哇塞”的&#xff0c;毫无问题的。 但结果就是不对。 那就调试一下吧&#xff0c;调试后发现生成的矩阵很不对劲&#…...

2024十月超全大模型常见面试题(附答案)

大模型相关的面试问题通常涉及模型的原理、应用、优化以及面试者对于该领域的理解和经验。以下是一些常见的大模型面试问题以及建议的回答方式&#xff1a; 请简述什么是大模型&#xff0c;以及它与传统模型的主要区别是什么&#xff1f; 回答&#xff1a;大模型通常指的是参…...

Java 的数据结构整理(整合版)

Java 的数据结构整理&#xff08;整合版&#xff09; 一、数据输入输出 https://www.runoob.com/java/java-scanner-class.html 这部分是为了预防 leetcode 刷习惯了&#xff0c;忘记怎么处理输入输出的问题 数据输入 Java的数据输入和 C 相比非常繁琐&#xff0c;因此大多…...

如何让信息学奥赛学习“边玩边学”?——趣味编程让枯燥学习变得有趣

信息学奥赛&#xff08;NOI&#xff09;作为一项高水平的编程竞赛&#xff0c;内容涉及到大量的算法、数据结构和复杂的逻辑思维&#xff0c;对学生的要求非常高。然而&#xff0c;面对枯燥的知识点和高难度的题目&#xff0c;很多学生在备赛过程中容易感到乏味甚至放弃。那么&…...

【艾思科蓝】C++游戏开发探秘:打造高性能游戏世界的钥匙

【IEEE出版 | 院士、Fellow报告】第八届电气、机械与计算机工程国际学术会议&#xff08;ICEMCE 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 引言 在当今的游戏开发领域&#xff0c;C以其高效、…...

企业如何做好数据安全防泄密?10个你不知道的防泄密措施

随着数字化转型的加速推进&#xff0c;企业在处理和存储大量数据时&#xff0c;数据泄密风险也显著增加。从客户资料到商业机密&#xff0c;敏感数据一旦泄露&#xff0c;可能对企业造成不可估量的损失。为了更好地应对这一挑战&#xff0c;企业需要采取全面的防泄密策略。以下…...

MySQL基本操作(1)

初始数据库 数据库的基本概念 数据库是一个按照数据结构来组织、存储和管理数据的仓库&#xff0c;换句话说&#xff0c;就是存储数据的仓库。 为何使用数据库&#xff1f;使用数据库不仅仅为了使数据持久化&#xff0c;还能使得数据能够进行有效的管理&#xff0c;以…...

Python 如何使用 Redis 作为缓存

Python 如何使用 Redis 作为缓存 一、引言 在现代 Web 应用程序和数据密集型服务中&#xff0c;性能 和 响应速度 是至关重要的因素。而当应用需要频繁访问相同的数据时&#xff0c;直接从数据库获取数据会耗费大量的时间和资源。因此&#xff0c;缓存系统成为了提升性能的重…...

Python知识点:基于Python工具,如何使用Mediapipe进行人体姿态估计

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 基于Python的Mediapipe人体姿态估计技术详解 在计算机视觉领域&#xff0c;人体…...

数据结构进阶:二叉搜索树_C++

目录 前言&#xff1a; 一、二叉搜索树 1.1二叉搜索树概念 2.2 二叉搜索树操作 1. 二叉搜索树的插入 1.1、插入过程 1.2、代码实现 2、二叉树的删除 2.1、结点删除情况 2.2、替换删除法 1、替换思路 2、代码实现&#xff1a; 3、二叉搜索树的查找 3.1、查找规则 …...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...