【JS】数组去重的四种方法

本文详细介绍了ES6的Set方法在去重中的应用,以及循环比较、对象法、正则法等多种去重策略,重点讨论了如何保持数组顺序并提升性能。通过实例展示了如何用这些方法找出并过滤掉重复项,确保结果为[13, 12, 5, 20]。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ES6的Set方法

此方法需要考虑兼容性

let arr = [12, 20, 13, 13, 12, 5, 20]
let res = []
res = [...new Set(arr)]
// 或者
// res = Array.from(new Set(arr)) // [12, 20, 13, 5]

2.循环比较法

取出某一项,拿后一项与之对比

let arr = [12, 20, 13, 13, 12, 5, 20]
// 第一种:遇到重复的,就删除当前项,结果会改变原本的顺序,而且性能差,每次删掉后,后面剩余数据的index都要变化
for (let i = 0; i < arr.length - 1; i++) {
      let cur = arr[i] // 当前项
      let args = arr.slice(i +1) // 剩余的项
      const index = args.indexOf(cur)
      if (index !== -1) { // 说明有重复的
        // 删掉当前项,[13, 12, 5, 20]
        arr.splice(i, 1) // 删掉当前项
        i-- // 从新的当前项开始继续循环
      }      
    }
// 第二种:遇到重复的,就拿最后一项替代当前项,然后把最后一项删除掉,不需要每次都改变index,性能好一点
for (let i = 0; i < arr.length - 1; i++) {
      let cur = arr[i] // 当前项
      let args = arr.slice(i +1) // 剩余的项
      const index = args.indexOf(cur)
      if (index !== -1) { // 说明有重复的
        // 遇到重复的,拿最后一项来替换,结果 [5, 20, 12, 13]
        arr[i] = arr[arr.length - 1]
        i-- // 从当前项(原本的最后一项)开始继续比较
        arr.length-- // 去掉最后一项

        将重复项设置为null, 结果[null, null, null, 13, 12, 5, 20],结合filter过滤null, [13, 12, 5, 20]
        arr[i] = null
      }      
    }
// 第三种:遇到重复的,就将当前项设置为null,结合filter将null过滤掉
for (let i = 0; i < arr.length - 1; i++) {
      let cur = arr[i] // 当前项
      let args = arr.slice(i +1) // 剩余的项
      const index = args.indexOf(cur)
      if (index !== -1) { // 说明有重复的
        // 将重复项设置为null, 结果[null, null, null, 13, 12, 5, 20],结合filter过滤null
        arr[i] = null
      }
    }
res = arr.filter(val => val !== null) // [13, 12, 5, 20]
// 第四种:从后面开始循环,删掉重复项后不会改变前面元素的index,可以保证顺序不改变,[12, 20, 13, 5]
for (let i = arr.length-1; i >= 0; i--) {
      let cur = arr[i]
      let args = arr.slice(0, i)
      if (args.indexOf(cur) !== -1) { // 重复项
        arr.splice(i, 1)
      }
    }

3.对象法

利用对象键值不能重复的特性,此方法可以保证顺序不改变[12, 20, 13, 5]

let arr = [12, 20, 13, 13, 12, 5, 20]
let obj = {}
for (let i = 0; i < arr.length; i++) {
  let cur = arr[i]
  if (obj[cur] === undefined) { // 如果为undefined,表示前面没有与该项相同的
    obj[cur] = cur
  } else { // 如果有相同的,就把当前项删掉
    arr.splice(i, 1)
    i--
  }
}

4.正则法

// 先将数组按升序或者降序排列
arr.sort((a, b) => a - b) // 升序
// arr.sort((a, b) => b - a) // 降序
// 将数组转化为字符串
arr = arr.join('@') + '@'
// 定义正则表达式,找到数字后面带有@符号的,1*表示连续匹配0到n次、
const reg = /(\d+@)\1*/g
// 定义新数组用来存放结果
 let newArr = []
arr.replace(reg, (val, group1) => {
	console.log(val, group1)
    newArr.push(Number(group1.split('@')[0]))
    // 或者
    // newArr.push(Number(group1.slice(0, group1.length - 1)))
})

 res = newArr // [20, 13, 12, 5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值