JavaScriptJavaScript·

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

投稿時間:2024-08-28 23:24:49閲覧数:40
専門記事
転載は出所を明記してください

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

コメント欄

まだコメントがありません。最初のコメントを投稿しましょう!

弦圈热门内容

cover

VueやNuxtで数学公式をレンダリングする方法は次のとおりです。

ウェブページ上で、美しい数学公式をレンダリングする方法はたくさんあります。しかし、これらの方法は基本的にVue.jsやNuxt.jsに直接適用できません。この記事では、Vue.jsまたはNuxt.jsでKaTeXとMathJaxを使用して数学公式をレンダリングする方法について説明します。KaTeXすべてのページ上の数学公式を自動的にレンダリングするには、CDNを使用してKaTeXをロードする必要があります:&lt;!-- index.html --&gt; &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;link rel="icon" href="/poem-studio-favicon-black.svg"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;link rel="stylesheet ...

Vue初学记录

网站开发,需要前端与后端的开发。前端指用户端、浏览器端,是用户能看得到的部分。后端指服务器端,是用户看不到的部分。前端开发,需要用到CSS3和HTML5以及JavaScript。后端开发能用的编程语言则很多了,主流的有python、java等,只要我们电脑能够使用的编程语言,服务端都能使用。目前流行前后端分离,后端只需要提供好接口就行了,前端直接使用后端的接口。前端三大框架:Vue、react、AngularVue是目前中国使用比较多的框架,因为创造这个框架的是中国人——前谷歌员工Even You。React框架则是Meta公司(原Facebook公司)创造的框架,Angular是谷歌建立的框架。从最近GitHub的数据上看,Vue是目前全世界下载量最多的框架,第二大的为React,第三为Angular。前端框架建立的目的,其实是为了方便开发,提高开发效率,降低开发难度。本质上,最后到浏览器那里,都是转换为CSS3、HTML5、JavaScript的语言。前端的开发,代码实现前,还需要设计UI界面,提高用户体验。因此,网站前后端开发分别对应三个职位——前端工程师、后端工程师、UI设计师 ...

Nuxtを使用してコードブロックをハイライト表示する方法は次のとおりです。

他のウェブサイトのように、ユーザーが書いたコードブロックをハイライト表示することもできますか?これを実現するのに役立つ2つのJavaScriptライブラリがあります。それぞれPrism.jsとhighlight.jsです。このチュートリアルでは、コードブロックのハイライトを実現する方法としてPrismJSを使用します。まず、npmを使用してPrismJSをインストールします:npm install prismjs次に、composablesフォルダに移動し、新しいファイルprism.jsを作成します。内容は以下の通りです:import Prism from 'prismjs' import 'prismjs/themes/prism-tomorrow.css' // 他のテーマを選択することもできます export default Prismこれで、PrismJSがインストールされ、設定できました。コードをハイライト表示する必要があるときは、highlightAll()関数を呼び出すだけで済みます。具体的な例は以下の通りです:&lt;script lang="ts" setup&gt ...

Nginx服务器反向代理

1. nginx服务器Nginx与Apache为两大主流web服务器。而我的轻量级云服务器使用了nginx。因为nginx相比与apache更轻量,性能更好,不怎么占内存,适合中小型服务器。同时Nginx善于应对高并发场景,在多用户同时点击的情况下,服务器能负荷得住。又由于nginx的负载均衡,让多个用户打开网站没那么卡。nginx官网安装教程Installing NGINX Open Source | NGINX DocumentationDebian12安装nginx:sudo apt-get update sudo apt-get install nginx最后输入sudo nginx -v验证安装。2. Nginx服务器反向代理客户端对代理是无感知的,只需将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

代数几何简介

1. Introduction代数几何是数学的核心领域,也是如今国际数学界的主流。代数几何与许多数学分支都存在广泛的联系,比如数论、微分几何、代数拓扑、复几何、表示论、同调代数、交换代数、偏微分方程等等,这些分支的发展同时也对代数几何起到促进作用。数学史上的许多重大的事件,比如,费马大定理、莫德尔猜想、韦伊猜想的证明都跟代数几何有关。同时,代数几何存在广泛的应用,比如密码学、弦理论、大数据、统计学习理论等等。代数几何之下有众多分支,比如复代数几何,热带几何,算术几何,远阿贝尔几何,$p$进霍奇理论(complex algebraic geometry, tropical geometry, arithmetic geometry, anabelian geometry, p-adic hodge theory),每个分支代表代数几何研究的一个大方向,而在每个大方向下,又有各种以不同的问题为导向的子方向。在这篇文章中,我们将会对代数几何,包括它的分支算术代数几何,做一个简短的介绍。2. An Introduction to Arithmetic Geometry算术几何是算术代数几何的简 ...

Python pip安装SSL证书错误

问题描述:正常使用pip install xxx安装会弹出错误,导致下载失败。必须增加trust host字段,才能下载成功:pip --trusted-host pypi.python.org install在cmd运行python -c "import ssl; print(ssl.get_default_verify_paths())"在默认路径里没有找到ca证书,而在Lib\site-packages\certifi文件夹中,却发现了cacert.pem文件。故而认为原因是ca证书丢失或者寻找ca证书路径出错,因此尝试修改pip的默认ca证书路径。pip.ini文件中有大量的pip配置信息,因此需要先找到该文件。在cmd通过pip -v config list发现,在多个路径中,都没有找到pip.ini文件。且了解到,pip会有一个默认的pip.conf文件(其实就是pip.ini),因此断定默认pip.ini配置文件丢失。解决办法:在python根目录中,新建pip.ini,在里面写上[global] index-url = https://mirrors.aliyun.co ...