·

JS实现数组去重的七种方法

Published at 2024-08-28 23:24:49Viewed 216 times
Please reprint with source link

JS数组去重的方式

例:将下面数组去除重复元素(以多种数据类型为例)

const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]

1.利用Set()+Array.from()

Set对象:是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即Set中的元素是唯一的

Array.from() 方法:对一个类似数组可迭代对象创建一个新的,浅拷贝的数组实例。

const result = Array.from(new Set(arr))
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

注意:以上去方式对NaNundefined类型去重也是有效的,是因为NaNundefined都可以被存储在Set中, NaN之间被视为相同的值(尽管在js中:NaN !== NaN)。

2.利用两层循环+数组的splice方法

通过两层循环对数组元素进行逐一比较,然后通过splice方法来删除重复的元素。此方法对NaN是无法进行去重的,因为进行比较时NaN !== NaN
function removeDuplicate(arr) {
  let len = arr.length
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1)
        len-- // 减少循环次数提高性能
        j-- // 保证j的值自加后不变
      }
    }
  }
  return arr
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN, NaN ]

3.利用数组的indexOf方法

新建一个空数组,遍历需要去重的数组,将数组元素存入新数组中,存放前判断数组中是否已经含有当前元素,没有则存入。此方法也无法对NaN去重。
  • indexOf() 方法:返回调用它的String对象中第一次出现的指定值的索引,从 fromIndex 处进行搜索。如果未找到该值,则返回 -1。
function removeDuplicate(arr) {
  const newArr = []
  arr.forEach(item => {
    if (newArr.indexOf(item) === -1) {
      newArr.push(item)
    }
  })
  return newArr // 返回一个新数组
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN, NaN ]

4.利用数组的includes方法

此方法逻辑与indexOf方法去重异曲同工,只是用includes方法来判断是否包含重复元素。
  • includes()方法:用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false。
function removeDuplicate(arr) {
  const newArr = []
  arr.forEach(item => {
    if (!newArr.includes(item)) {
      newArr.push(item)
    }
  })
  return newArr
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

注意:为什么includes能够检测到数组中包含NaN,其涉及到includes底层的实现。如下图为includes实现的部分代码,在进行判断是否包含某元素时会调用sameValueZero方法进行比较,如果为NaN,则会使用isNaN()进行转化。

具体实现可参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

简单测试includes()NaN的判断:

const testArr = [1, 'a', NaN]
console.log(testArr.includes(NaN)) // true

5.利用数组的filter()+indexOf()

filter方法会对满足条件的元素存放到一个新数组中,结合indexOf方法进行判断。
  • filter() 方法:会创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
function removeDuplicate(arr) {
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index
  })
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined ]

注意:这里的输出结果中不包含NaN,是因为indexOf()无法对NaN进行判断,即arr.indexOf(item) === index返回结果为false。测试如下:

const testArr = [1, 'a', NaN]
console.log(testArr.indexOf(NaN)) // -1

6.利用Map()

Map对象是JavaScript提供的一种数据结构,结构为键值对形式,将数组元素作为map的键存入,然后结合has()set()方法判断键是否重复。
  • Map 对象:用于保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为一个键或一个值。
function removeDuplicate(arr) {
  const map = new Map()
  const newArr = []

  arr.forEach(item => {
    if (!map.has(item)) { // has()用于判断map是否包为item的属性值
      map.set(item, true) // 使用set()将item设置到map中,并设置其属性值为true
      newArr.push(item)
    }
  })

  return newArr
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

注意:使用Map()也可对NaN去重,原因是Map进行判断时认为NaN是与NaN相等的,剩下所有其它的值是根据 === 运算符的结果判断是否相等。

7.利用对象

其实现思想和Map()是差不多的,主要是利用了对象的属性名不可重复这一特性。
function removeDuplicate(arr) {
  const newArr = []
  const obj = {}

  arr.forEach(item => {
    if (!obj[item]) {
      newArr.push(item)
      obj[item] = true
    }
  })

  return newArr
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]


原文链接:https://blog.csdn.net/qq_52732369/article/details/121877897

0 人喜欢

Comments

There is no comment, let's add the first one.

弦圈热门内容

React Native UI库介绍与对比

React Native的生态与React.js相比,没那么丰富,或者说手机端的生态本身就跟Web端相差甚远。React.js作为Web端虽然生态丰富,但由于其JS库大多数都不能直接用在React native中,因此很多在Web端存在诸多解决方案的问题,如代码块高亮、渲染数学公式,在手机端都难找到合适的办法。React Native的UI库,其实可以选择的并不多,不像Web端百花齐放,选个UI库都能选择困难症。在本文,我将会介绍几个我所知道的React native UI库,其中有几个我是用过的。1. React Native Paper这是一个Material Design风格的UI库,在GitHub拥有13.4k个stars,官方文档👉React Native Paper。该库安装步骤简单,组件使用以及自定义也容易,唯一的缺点就是组件不够多,有些场景需要你另外补充其他库来满足需求。React Native Paper应该是React native唯一一个Material Design UI库,该库能够跟React native navigation整合,构建Material风格的 ...

🇪🇸 3.3 阿维拉

​宛如异世界城镇般的城市,中世纪时期的巨大的围墙将整个旧城区彻底包围,竟然没有经过火药的洗礼,一直保存至今。尖顶城垛却有着半圆形的塔楼,很明显是融合了穆斯林世界和基督教王国的风格,印证了阿维拉在再征服运动中的战略地位。不知道巨人里的玛利亚之墙灵感会不会是来自这里()没有过度的商业化和游客旅行团,所有的古迹都显得如此纯粹。以及三月正是赏樱的季节,没想到在西班牙也能欣赏到灿烂绽放的樱花,这几天在卡斯蒂利亚拉曼查的赏樱体验也是十分独特,比起虽然是漫山遍野但却人山人海的樱花园,我更喜欢一个人独自欣赏公路旁孤芳自赏无人问津的野樱。具有东方色彩的樱花竟然能与西式的城墙塔楼同框,有一说一确实有种奇妙的违和感()不过说起来不知道什么时候能有机会在樱花祭再去一次日本呢😭

由于备案需要,xianquan.net暂时关闭,原地址manitori.xyz可正常访问。由于苹果开发者账号费用过高,弦圈APP IOS版暂不支持。

这几天,我在给弦圈新域名xianquan.net以及弦圈APP备案,其中域名备案为了让管局通过,需要我暂时关闭掉xianquan.net,多有不便尽请谅解。弦圈的原地址manitori.xyz不受影响,可正常访问,然后未来manitori.xyz是不会丢弃的(见弦圈更换新网址xianquan.net,原地址manitori.xyz保留)。接着,这几天我原本打算把弦圈APP IOS版也给上线了,可惜苹果太吸血了,每年费用比微信还得高一半。因此我决定暂时只支持弦圈APP安卓版,IOS版等以后再说吧,虽然代码写了,但是无法打包IPA文件,而且就算打包完成也无法安装到苹果手机。最后不得不说,目前访问弦圈还是有点卡,虽然之前已经优化过了(最近有人反馈网站卡、打不开,我自己也试过这种情况,已再次对弦圈进行优化),但人多了还是会明星感觉到卡。原因目前也基本确定,之后我会再次更换并升级服务器,而更换服务器就需要迁移数据,迁移数据过程需要关停服务器。为了将影响降到最低,我选择关闭服务器在晚上进行,错开访问高峰。

弦圈APP已开发完成,准备发布

经过两个月的漫长艰难开发,大家期待已久的弦圈APP终于开发完成,目前正在准备发布的工作。马上弦圈APP的第一个版本就要跟大家见面了,暂时先推出安卓版,之后测试完苹果手机再推出IOS版。目前弦圈APP的核心功能已经基本开发完毕,包括:写文章、发帖子、回答问题、创建圈子、看文章、看书、看帖子、看词条、圈子、看问题和回答、发布评论与回复、点赞与踩、收藏夹、关注用户、搜索、用户中心、个人主页、设置、消息中心等等。但是仍然有一些未完成的功能,这些功能计划之后慢慢更新吧,它们包括:创建词条、写书、提问、任务中心、商店、赞赏、钱包与充值、交易中心、签到等等。上面提到的都是大的功能模块,下面我就提及一下APP一些细节的问题,这些问题虽然小,但也同样重要。与网页端弦圈不同,手机端弦圈APP使用markdown编辑器,用于文本格式、图片、链接等输入。关于markdown语法可自行百度,事实上markdown语法写起来比富文本要方便。至于为啥使用markdown编辑器,原因如下:首先APP跟网页端(Web端)有很大的不同,这使得想要跟Web端一样用富文本编辑器会变得困难。绝大多数现有的富文本编辑器都是基于W ...

狭义相对论核心问题

狭义相对论(Special Relativity)是爱因斯坦在1905年提出的理论,它主要为了解决经典物理学(牛顿力学和麦克斯韦电磁理论)之间的矛盾,并重新定义时间、空间、质量和能量等基本物理概念。以下是狭义相对论旨在解决的核心问题:1.经典力学与电磁学的矛盾牛顿力学的相对性原理:牛顿力学认为,在惯性参考系(匀速直线运动或静止的参考系)中,物理定律的形式保持不变(例如,在均匀运动的火车上做实验,结果与静止时一致)。麦克斯韦方程的“特殊地位”:麦克斯韦方程组预言了光速的恒定值,但经典物理认为光速应遵循伽利略变换(即速度叠加)。例如,若你以速度 v 追赶一束光,光速对你来说应变为 c - v ,但这与实验观测矛盾。矛盾的核心:牛顿力学的伽利略变换与麦克斯韦方程组的不兼容性,引发了物理学基础的危机。2.以太理论的失败以太假说的背景:19世纪物理学家假设存在一种名为“以太”(aether)的绝对静止介质,光波通过以太传播(类似声波在空气中传播)。迈克尔逊-莫雷实验(1887年):实验试图通过测量地球在以太中运动引起的“以太风”来验证以太的存在,但结果却表明光速在不同方向上始终相同,与以太假说矛 ...

婚礼拍摄流程

设备:a7m3 + 28-75 f2.8 + 棍灯 + 闪光Tip 1: 要电梯卡:摄影师可以在酒店前台说明自己是拍摄婚礼的,通常可以拿到电梯卡,方便进出。提前联系:如果是朋友关系,可以要伴娘的联系方式,方便沟通,避免被堵在酒店楼下;但如果是工作关系,则不建议这样做,以免引起不必要的麻烦,可以提前要电梯卡。Tip 2: 收费标准:在二三线城市,婚礼摄影的费用一般在1000-1500元之间;在一线城市如北京、上海、广州、深圳,费用则从1500元起,上不封顶。影响因素:收费标准主要取决于摄影师的样片质量和实际拍摄水平。Tip 3: 自报家门:摄影师见到新娘和伴娘时,应先自我介绍,表明身份。拍摄环境:新娘可能会询问房间布置是否适合拍摄,如果光线不足,摄影师需要自带灯光;如果房间空间狭小,则需要使用广角镜头。Tip 4: 静物拍摄:先拍摄婚鞋、婚戒、婚书等静物,记录这些细节。场景布置:观察房间布置,拍摄好看的地方,尤其是新人用心布置的部分。新娘化妆:拍摄新娘化妆的过程,留意光线充足的地方,适合摆拍。贵重物品拍摄:拍摄婚戒等贵重物品时,一定要有主家人在场,避免后续出现问题。Tip 5: 晨袍拍摄 ...

1月26日弦圈APP进度更新

最近这段时间,我都把时间花在开发弦圈APP上了。这个过程可谓是历经波折,开发过程中我曾多次更换框架,每更换一次就意味着得重新从零开始写,而更换完框架后又因为遇到某些难以解决的问题,又重新回到原来的框架。总之,如今经过两个星期的开发,终于逐渐成型,但还是有很多地方未实现的。目前弦圈APP,已实现功能包括:登陆注册、看文章、看帖子、看问题和回答、看百科词条、圈子、发布评论与回复、点赞与踩、关注用户等。未完成功能包括:用户主页、个人中心、消息中心、词条部分功能(如目录)、写文章、发帖子、写书、提问和回答、看书、签到、任务中心、交易中心等等。完成弦圈APP仍然任重而道远,因为弦圈从开发到上线就写了六个月代码,再加上上线至今又经过半年陆陆续续的更新,如今的弦圈已然代码规模已经不小。而我从零开始写APP,用的还是新技术,不亚于从零开始重写一遍整个弦圈。这工作量对于一个人来说,实在是太大了。同时,我在开发APP的过程中,也发现弦圈网站的一些bug,也来不及修复。最后我就发一发弦圈APP的测试图片吧。

写作小标题

一 抓好思想教育,“主旋律”越唱越响1.一以贯之,强化思想政治引领。集中学习抓引导,小组共论鼓干劲,个人自学促提升。2.上下同步,提升青年精神素养。 以上率下强推进,调研座谈保落实,简报交流取真经。3.双效合一,深化优良传统教育。先辈传承长士气 专题培训固根本 时空沉浸坚信仰,青言青语润人心。二 强化职能定位,“主力军”越建越强1.多维发力,围绕中心服务大局。安全生产不懈怠,优质服务不断档,创新创效不停歇。2.齐头并进,践行央企责任担当。乡村振兴亮实效,低碳生活有妙招。3.统筹谋划,志愿服务成效显著。冬奥保障显担当,旺季生产加满油,蓝天课堂掀新篇。三 提升服务能力,“主心骨”越来越硬1.多措并举,有效助力青年发展。基层调研知实情,青春助力有延续。2.对准焦距,关心关爱青年成长。新春送福暖人心,圆梦助力解难题,双节关爱有温度。3.双轮驱动,持续推动争先创优。文艺文创树形象,青年才俊扬志气。四 夯实团建基础,“主阵地”越筑越实1.分类施策,健全制度合规管理。完善制度粗管理,人才培养筑根基。2.挖掘典型,组织建设活力十足。先进典型展风采。

共青团工作要点

一、政治建设:思想政治引领:注重加强团员政治教育和青年思想政治引领,以习近平新时代中国特色社会主义思想为指引,深入学习习近平总书记关于青年工作的重要思想,坚持党建带团建,扎实开展团员和青年主题教育,深入学习党的二十大精神和团十九大精神,有针对性开展“青年大学习”教育培训。战略文化传导:结合集团战略和本单位觉政工作重点,依托青年论坛,组建青年讲师团,教育引导广大团员青年传承弘扬集团自身优良传统、红色精神,加强宣讲,积极传播企业文化理念。舆论宣传工作:田青工作有宣传阵地、有宣传队伍,持续加强宣传平台建设,团青活动开展丰富多彩的宣传工作。二、作用发挥国绕中心、服务大局:常态化开展青年籍神素养提升工程、主题实践活动,引领团员青年在安全生产防范风险、深化改革等领域发挥生力军与突击队作用,保障生产、运行、服务、创新等方面工作平稳有序。青年文明号活动:国绕持续打造世界一流产品服务水平,推进青年文明号创建,积极组织青年文明号开放周主题实践话动,创建活动特色鲜明,创建工作有制度、有记录、有成效,加强对往届青年文明号监督工作。青年志愿者活动:以青春之力服务-国之大者”,开展形式多样的志愿者活动及社会公益活 ...

未来所有人都能被一种名为‘复活术’的仪式复活,而我被复活进了一座神秘的监狱,在这里每个人无时无刻都要接受无比残忍的折磨...

在未来的地球上,诞生了一种名为“复活术”的神奇仪式,所有人都能被该仪式复活,且不需要付出任何代价。你只需要在任意地方画出一些玄奥的几何图案,然后随意念出任意条件,如果有人满足你所说的条件,那么这个人就会马上被复活。如果满足条件的不止一个人,那么所有满足条件的人都会被同时复活。于是,死去的科学家、伟人们都被人们争相复活,人类的科技水平在短短数年内就得到了飞速发展。同时地球的人口也开始了指数型暴涨,到了2080年,全世界人口就已经到达400亿!因为人口的暴涨资源开始紧缺,加上死亡已经不再忌讳,很多人开始胡作为非,有些无聊的人甚至把烧杀抢夺、花样自杀当作自己的日常生活。于是各国政府纷纷出台《复活法》,限制复活术的使用,每个人禁止生育后代,以及禁止自杀,所有自杀者复活后会被直接拘禁。就这样,社会秩序的混乱才逐渐消停了一些。虽然人类距离抵达一级文明的水平还有很长一段时间,但这样史无前例的科技发展速度还是让大家沉浸在了征服宇宙的未来无尽幻想之中,却殊不知一场同样史无前例的浩大危机正在逼近......不知道多少年过去,在仙界死去的陈默也被复活术复活后,就发现自己已经置身在这座名为“通天塔”的监狱之中 ...

李群和李代数经典教材:Structure and Geometry of Lie Groups

本书隶属于Springer Monographs in Mathematics系列,作者是Joachim Hilgert和Karl-Hermann Neeb。这是本不错的李群李代数教材,可以用于入门李群和李代数。我不是做李群和李代数这方面的,但印象中,李群李代数相关的教材似乎并不是很多,并且很多教材写得并不那么好懂。而这本教材,应该算是我所知道的最适合入门的教材之一了。本书从最基础的一般线性群开始讲起,借助这些矩阵群的例子,一步步上升到李群。所谓的李群其实就是一个群加上流形结构而已。本书在讲完李括号后,就直接开始提及李代数,所谓的李代数就是一个向量空间带上一个叫做李括号的双线性函数。本书节奏紧凑、内容推进速度恰当,知识密度也高没有太多废话,是标准的代数风格的教材。由于我当初只大概看过一二章,用于补充李群和李代数相关的基础知识,因此并没有太过深入,就不过多评价。顺带一提,李群和李代数都跟表示论有直接联系,因此想要做表示论的朋友或许也应该学点李群和李代数。最后我看了一下下载这本书的日期,已经是2020年了,当时的我刚刚大一,印象中是首师大的一位学长在数学群里推荐的。特此怀念一下。更新:作者 ...