千家信息网

七种JS实现数组去重的方式分别是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章将为大家详细讲解有关七种JS实现数组去重的方式分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。例:将下面数组去除重复元素(以多种数据类
千家信息网最后更新 2026年11月02日七种JS实现数组去重的方式分别是什么

这篇文章将为大家详细讲解有关七种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 ]

注意:以上去方式对NaN和undefined类型去重也是有效的,是因为NaN和undefined都可以被存储在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()进行转化。

简单测试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 ]

关于七种JS实现数组去重的方式分别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

数组 方法 元素 对象 方式 属性 此方法 结果 循环 测试 原始 内容 数据 文章 更多 知识 篇文章 类型 结构 顺序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 深圳九邦互联网科技有限公司 科技互联网项目 互联网科技开发公司 未来的互联网科技 唐信互联网科技 大连 兼蜜互联网科技 成都仁贤领冠互联网科技有限公司 互联网科技热点资讯 剑昆互联网络科技有限公司临桂 金融科技与互联网金融相同和不同 宁夏众和广鑫互联网科技有限公司 互联网科技与大数据专业 内蒙古九一互联网科技 广州新华互联网科技学校电竞方面 浙南科技城互联网大厦招聘 互联网科技包装股份有限公司上市 抖集互联网科技技术咨询 陕西彩京云互联网科技有限公司 上海旺乐尼互联网科技有限公司 重生之互联网科技帝国 中国互联网科技股 随着互联网科技发展 贵州叶脉互联网科技有限公司所属行业 知域互联网科技有限公司大骗子 互联网科技年终奖 东营紫格互联网科技 湖北辰鑫科技互联网 陕西九四连强互联网科技有限公司 上海万顺科技互联网有限公司招聘
0