Javascript 数组(Array)去重的几个方法

这里的数组是基本数据类型组成的数组,如nums = [0, 0, 5, 9, 1, 1, 1, 2, 12, 2, 3, 3, 4]

在不改变原数组的情况下:
1.最基本的去重方法

思路:定义一个新数组,并存放原数组的第一个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中。

function removeDuplicates(arr) {
  const res = [arr[0]], len = arr.length
  let i = 1
  for (; i < len; i++) {
    const len2 = res.length
    let repeat = false, j = 0
    for (; j < len2; j++) {
      if (arr[i] === res[j]) {
        repeat = true
        break
      }
    }
    if (!repeat) {
      res.push(arr[i])
    }
  }
  return res
}
1.先排序再去重

思路:先将原数组排序,在与相邻的进行比较,如果不同则存入新数组。

function removeDuplicates(arr) {
// sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。
  const arr2 = [...arr].sort(), res = [arr2[0]], len = arr2.length
  let i = 1
  for (; i < len; i++) {
    if (arr2[i] !== res[res.length - 1]) {
      res.push(arr2[i])
    }
  }
  return res
}
3.利用对象的属性去重(推荐)

思路:每次取出原数组的元素,然后在对象中访问这个属性,如果存在就说明重复。

function removeDuplicates(arr) {
  const arrObj = {}, len = arr.length
  let i = 0
  for (; i < len; i++) {
    if (!arrObj[arr[i]]) {
      arrObj[arr[i]] = arr[i] + ''	// 转换成string,方便上行if判断
    }
  }
  return Object.keys(arrObj).map(it => +it)
}
3.利用下标查询

思路:每次取出原数组的元素,在新数组上使用indexOf查询下标,如果>=0就说明重复。

function unique(arr) {
  const res = [arr[0]], len = arr.length
  let i = 1
  for (; i < len; i++) {
    if (res.indexOf(arr[i]) === -1) {
      res.push(arr[i])
    }
  }
  return res
}
5.利用 form new Set ()

思路:ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成 Set 数据结构(new Set())。Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

function unique(arr) {
  return Array.from(new Set(arr))
}
6.运用扩展运算符

扩展运算符用三个点号(…)表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,它是rest的逆运算,rest的功能是把逗号隔开的值序列组合成一个数组。

function unique(arr) {
  return [...new Set(arr)]
}
在只能改变原数组的情况下:

曾刷到一个题题目描述
这里是只能在nums数组操作的,并且返回的必须是nums数组的length,本质也是数字去重

1.本人菜鸟解法
// 执行时间320ms
function removeDuplicates(nums: number[]): number {
    let unique = []
    for (let i = nums.length - 1; i >= 0; i--) {
        const current = nums[i]
        if (unique.includes(current)) {
            nums.splice(i, 1)
        } else {
            unique.push(current)
        }
    }
    return nums.length
};
2.队友解法
// 执行时间80ms
function removeDuplicates(nums: number[]): number {
    let i = 0, j = 1, len = nums.length
    for (; j < len; j++) {
        const current = nums[i], next = nums[j]
        if (current !== next) nums[++i] = next
    }
    nums.splice(i + 1)
    return i + 1
};

So,算法之路道阻且长。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值