写一个去除数组中重复元素的函数

1.使用ES6的Set数据结构

Set是一种只存储唯一值的数据结构,因此任何重复的元素都会被自动忽略。然后,我们使用扩展运算符…将Set对象转换回数组,并返回这个新的数组。

请注意,这种方法会改变原始数组中元素的顺序,因为Set不保证元素的插入顺序。如果你需要保持元素的原始顺序,那么你可能需要使用其他方法,例如使用filter()方法和indexOf()方法来检查元素是否已经在结果数组中。

function removeDuplicates(array) {  return [...new Set(array)];  
}    // 使用示例  
const arr = [1, 2, 2, 3, 4, 4, 5, 5, 5];  
const uniqueArr = removeDuplicates(arr);  
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

2.使用filter()方法和indexOf()方法

这种方法通过遍历数组,并使用indexOf()检查当前元素是否首次出现来实现去重。

function removeDuplicates(array) {  return array.filter((item, index) => {  return array.indexOf(item) === index;  });  
}   const arr = [1, 2, 2, 3, 4, 4, 5, 5, 5];  
const uniqueArr = removeDuplicates(arr);  
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

3.使用reduce()方法

reduce()方法可以将数组元素组合成一个新值,我们可以利用它来创建一个没有重复元素的数组。

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

4.使用Map数据结构

Map对象允许你存储键值对,并且键是唯一的。我们可以利用这个特性去除重复元素。

function removeDuplicates(array) {  const map = new Map();  array.forEach(item => map.set(item, true));  return Array.from(map.keys());  
}  const arr = [1, 2, 2, 3, 4, 4, 5, 5, 5];  
const uniqueArr = removeDuplicates(arr);  
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

5.使用两层循环

这种方法通过两层循环来比较和删除重复的元素,虽然效率不如前面提到的方法,但在一些简单的场景下仍然可以使用。

function removeDuplicates(array) {  for (let i = 0; i < array.length; i++) {  for (let j = i + 1; j < array.length; j++) {  if (array[i] === array[j]) {  array.splice(j, 1);  j--; // 因为删除了一个元素,所以索引需要回退一位  }  }  }  return array;  
}  const arr = [1, 2, 2, 3, 4, 4, 5, 5, 5];  
const uniqueArr = removeDuplicates(arr);  
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

每种方法都有其优缺点,你可以根据具体的场景和需求选择最适合的方法。在性能敏感的场景下,使用Set或Map通常会比使用循环更高效。


拓展一下🤷‍♀️

  • indexOf()

indexOf() 是 JavaScript 数组(Array)对象的一个方法,它用于返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回 -1。

这个方法接受两个参数:

searchElement(必需):要查找的元素。
fromIndex(可选):开始查找的位置。如果该索引值大于或等于数组长度,则返回 -1,即数组不会被搜索。如果为负值,则将其作为从数组末尾开始的偏移量。即使该值为负数,它仍然从前往后搜索。如果省略该参数,则整个数组都会被搜索。
下面是一个使用 indexOf() 方法的例子:

const array = [2, 5, 9, 1];  const index = array.indexOf(9);  
console.log(index); // 输出: 2  const notFoundIndex = array.indexOf(3);  
console.log(notFoundIndex); // 输出: -1  const fromIndexIndex = array.indexOf(2, 3);  
console.log(fromIndexIndex); // 输出: -1(因为从索引 3 开始查找,数组中没有更多的 2)
  • reduce()

reduce() 是 JavaScript 数组(Array)对象的一个方法,它接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

reduce() 方法的基本语法如下:

array.reduce(function(accumulator, currentValue, currentIndex, array) {  // 返回累加器积累的结果  
}, initialValue);

参数说明

function(accumulator, currentValue, currentIndex, array): 执行数组中每个元素调用的函数,它包含四个参数。
accumulator(必需):累积器,累积回调函数的返回值;它是上一次调用回调时返回的累积值,或者是initialValue(如果提供了的话)。
currentValue(必需):数组中正在处理的当前元素。
currentIndex(可选):数组中正在处理的当前元素的索引。如果提供了initialValue,则索引为0,否则从索引1起始。
array(可选):调用reduce()的数组。
initialValue(可选):作为第一次调用callback函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce将报错。
reduce() 方法非常适合将数组元素组合成单个输出值,比如求和、求积或者将数组对象合并为单一对象。

以下是一些使用 reduce() 方法的例子:

求和

const numbers = [1, 2, 3, 4, 5];  
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);  
console.log(sum); // 输出: 15

数组元素去重:

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]

将多维数组转换为一维数组:

const nestedArray = [1, [2, 3], [4, [5, 6]]];  
const flattenedArray = nestedArray.reduce((accumulator, currentValue) => {  return accumulator.concat(Array.isArray(currentValue) ? currentValue.reduce((a, b) => a.concat(b), []) : accumulator.concat(currentValue));  
}, []);  
console.log(flattenedArray); // 输出 [1, 2, 3, 4, 5, 6]

计算数组中每个元素出现的次数:

const votes = ["vue", "react", "angular", "vue", "react", "angular", "vue", "react", "vue"];  
const count = votes.reduce((accumulator, currentValue) => {  if (!accumulator[currentValue]) {  accumulator[currentValue] = 1;  } else {  accumulator[currentValue]++;  }  return accumulator;  
}, {});  
console.log(count); // 输出 { vue: 4, react: 3, angular: 2 }

对象属性的累加:

const items = [  { name: 'item1', price: 10 },  { name: 'item2', price: 20 },  { name: 'item3', price: 30 }  
];  
const totalPrice = items.reduce((accumulator, currentValue) => accumulator + currentValue.price, 0);  
console.log(totalPrice); // 输出 60

字符串连接:

虽然这可以用 join() 方法更简单地完成,但 reduce() 也可以用来连接数组中的字符串元素。

const words = ['Hello', 'world', '!'];  
const sentence = words.reduce((accumulator, currentValue) => accumulator + ' ' + currentValue);  
console.log(sentence); // 输出 "Hello world !"

这些只是 reduce() 方法的一些应用场景示例。实际上,由于 reduce() 的灵活性,它可以用于任何需要累积或缩减数组元素的场景。

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

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

相关文章

2024中国(京津冀)太阳能光伏推进大会暨展览会

2024年中国(京津冀)太阳能光伏推进大会暨展览会是一个旨在促进太阳能光伏产业发展的重要会议和展览会。该活动将在中国的京津冀地区举行&#xff0c;旨在汇聚全球太阳能光伏领域的专业人士、政府代表、企业家和科研人员&#xff0c;共同探讨太阳能光伏技术的最新进展和未来发展…

数据集成工具 ---- datax 3.0

1、datax: 是一个异构数据源离线同步工具&#xff0c;致力于实现关系型数据库&#xff08;mysql、oracle等&#xff09;hdfs、hive、hbase等各种异构数据源之间的数据同步 2、参考网址文献&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.md 3、Da…

避抗指南:如何寻找OLED透明屏供应商

寻找OLED透明屏供应商&#xff0c;你可以按照以下步骤进行&#xff1a; 明确需求&#xff1a;首先&#xff0c;你需要明确自己的需求&#xff0c;包括所需OLED透明屏的尺寸、分辨率、亮度、色彩饱和度等具体参数&#xff0c;以及预算和采购量。这有助于你更精准地找到符合需求的…

【sgPhotoPlayer】自定义组件:图片预览,支持点击放大、缩小、旋转图片

特性&#xff1a; 支持设置初始索引值支持显示标题、日期、大小、当前图片位置支持无限循环切换轮播支持鼠标滑轮滚动、左右键、上下键、PageUp、PageDown、Home、End操作切换图片支持Esc关闭窗口 sgPhotoPlayer源码 <template><div :class"$options.name"…

革命性创新:聚道云软件连接器如何为企业重塑财务管理流程?

一、客户介绍 某科技股份有限公司是一家专注于高性能存储技术领域的创新型科技公司。自公司成立以来&#xff0c;该公司始终秉持创新发展的理念&#xff0c;致力于为客户提供卓越的存储解决方案&#xff0c;以满足不同行业对数据存储的需求。作为业界的佼佼者&#xff0c;该公…

SpringBoot(依赖管理和自动配置)

文章目录 1.基本介绍1.springboot是什么&#xff1f;2.快速入门1.需求分析2.环境配置1.确认开发环境2.创建一个maven项目3.依赖配置 pom.xml4.文件目录5.MainApp.java &#xff08;启动类&#xff0c;常规配置&#xff09;6.HelloController.java &#xff08;测试Controller&a…

数字证书在网络安全中的重要性与实际应用

数字证书作为一种“电子身份证”&#xff0c;在当今数字化的商业环境中有着广泛的实际应用。它主要用于身份认证、加密通信、电子签名和安全访问控制等方面&#xff0c;为各行各业提供了安全可靠的数字化解决方案。 网络安全领域 在网络通信中&#xff0c;数字证书被广泛应用…

String 底层是如何实现的?

1、典型回答 String 底层是基于数组实现的&#xff0c;并且数组使用了 final 修饰&#xff0c;不同版本中的数组类型也是不同的&#xff1a; JDK9 之前&#xff08;不含JDK9&#xff09; String 类是使用 char[ ]&#xff08;字符数组&#xff09;实现的但 JDK9 之后&#xf…

MySQl基础入门⑧

上一章的内容 练习&#xff01;上一章表的内容&#xff01;&#xff01;&#xff01;熟能生巧 先重新创建一个数据库 命令create database supermarket; 然后查看数据库、再切换到当前数据库。 查看数据库 : show databases; 切换到当前数据库: use supermarket;创建员工…

动态规划:4种遍历方向图解+Python实现

前言 动态规划类题型在遍历过程中&#xff0c;根据状态转移函数的不同&#xff0c;代码实现时遍历的方向也会有所差异。总的来说&#xff0c;一共可以总结为下图四种模式&#xff1a; 红色五角星表示当前要计算的状态值&#xff1b;白底箭头代表哪些状态要提前算出来&#xf…

【C++设计模式】UML图的介绍及其画法

文章目录 前言一、UML图的介绍1.1 UML图是什么1.2 UML图的作用 二、UML图的画法2.1 最简单的UML图2.2 继承的UML图2.3 关联关系2.4 聚合关系2.5 组合关系2.6 依赖关系 总结 前言 在软件开发过程中&#xff0c;设计模式是一种被广泛应用的方法&#xff0c;它为解决特定问题提供…

centos7.6 tinyproxy BasciAuth

1 为什么centos7.6 tinyproxy 设置了BasicAuth 就会在配置文件这一行报错 BasicAuth myuser mypassword # 设置用户名密码,需要 1.10.0 以上版本才有效,否则报错 2 查看您的 Tinyproxy 版本 tinyproxy -v 3 yum只有1.8 只能自己编译 3.1 编译工具和库。 sudo yum install gc…

十二、软考-系统架构设计师笔记-信息系统架构设计理论与实践

1、信息系统架构基本概念及发展 信息系统架构的定义 信息系统架构是该系统的一个(或多个)结构&#xff0c;而结构由软件元素、元素的外部可见属性及它们之间的关系组成。 信息系统架构分类 信息系统架构分为物理结构与逻辑结构两种&#xff1a; 物理结构是指不考虑系统各部分…

【C++】AVL树的插入、旋转

目录 一、AVL树介绍1.1 概念1.2 定义 二、AVL树的实现2.1 插入2.2 旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋 一、AVL树介绍 1.1 概念 AVL树是高度平衡的二叉搜索树&#xff0c;相比普通的二叉搜索树&#xff0c;它防止了变成单支树的情况。因为AVL树每插入…

云服务器2核4G配置,阿里云和腾讯云哪个便宜?性能更好?

租用2核4G服务器费用多少&#xff1f;2核4G云服务器多少钱一年&#xff1f;1个月费用多少&#xff1f;阿里云2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年&#xff1b;腾讯云轻量2核4G服务器5M带宽165元一年、252元15个月、540元三…

Linux命令-基础

Linux命令-基础 目录 Linux命令-基础lscd(change directory)pwd(print work directory)mkdir(make directory)文件操作命令touchcatmorecp&#xff08;copy&#xff09;mv&#xff08;move&#xff09;rm&#xff08;remove&#xff09; 寻找命令whichfind grepwc管道符echotai…

C语言快速入门之字符函数和字符串函数

一.字符分类函数和字符转换函数 C语言中有一系列的函数专门做字符分类的&#xff0c;就是区分一个字符是属于什么类型的&#xff0c;头文件是 #include <ctype.h> 以下是具体函数&#xff1a; 这些函数的使用方法类似&#xff0c;我们写出一些代码来举例。 例如&…

解决ChatGPT发送消息没有反应

ChatGPT发消息没反应 今天照常使用ChatGPT来帮忙码代码&#xff0c;结果发现发出去的消息完全没有反应&#xff0c;即不给我处理&#xff0c;也没有抱任何的错误&#xff0c;按浏览器刷新&#xff0c;看起来很正常&#xff0c;可以查看历史对话&#xff0c;但是再次尝试还是一…

【笔记】道路不平度的功率谱密度计算时的问题

参考: 1. 道路空间功率谱密度与时间功率谱密度(笔记) 2. 功率谱密度PSD(笔记) 1.定义 (1)通常把路面相对于基准平面的高度q,沿道路走向长度l的变化q(l)称为路面纵断面曲线或不平度函数 (2)为了表述车辆振动时路面输入的不平度,采用路面功率谱密度描述其统计特性。 (…

基于springboot+vue的线上教育系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 现在大家的生活方式正在被计算机的发展慢慢改变着&#xff0c;学习方式也逐渐由书本走向荧幕,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变&#xff0c;人们的娱乐方式不仅仅…