JavaScript中,数组去重二三事

前言

前端开发过程中,除了完成万恶的产品经理的要求以外,维护也是日常的工作。最近在重构一个旧产品的代码,emmm可读性惨不可睹,一堆乱七八糟的命名就算了,还遇到一个对数组去重的代码,自己也额外找了其他去重的方法,整理了出来总结一下

原始的去重

function uniqArr (array) {
  var temp = []
  var index = []
  var l = array.length
  for (var i = 0; i < l; i++) {
    for (var j = i + 1; j < l; j++) {
      if (array[i] === array[j]) {
        i++
        j = i
      }
      temp.push(array[i])
      index.push(i)
    }
    return temp
  }
}

这是旧代码里面的数组去重,emmm你要说可读性的话我个人肯定打零分的,这个函数除了名字有可读性外,其他地方一眼就看不出来在干嘛,中间变量居多,而且还两个for嵌套循环,不过真要说它有什么优点的话,他的兼容性和性能相比其他应该是最好的,而且如果你有数组对象去重的话,这个方法也是可以的。非常原始的一种去重,并没有使用任何封装的方法。

改良版

function uniqArr (array) {
  let data = []
  array.forEach(function(value){
    if (!data.includes(value)) {
      data.push(value)
    }
  })
  return data
}

这是使用了ES6的数组includes方法改良的数组去重,相比原始版本,可读性,简洁性都提高了很多,思路也更清晰。相比第一种手动去判断数组,直接使用JavaScript提供的方法判断,遍历一次,如果没有该数据则push进去,中间量也减少到一个,你也可以直接使用数组的indexof方法,都是一样的效果。

数组去重骚操作

用来用去,多多少少都是比较繁琐建立函数的形式去重,如果可以直接一行代码搞定岂不是很酷?还真有

let data = [...new Set([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])] // [1,2,3,4,5]

使用这个方法的话,你需要先熟悉一下Set,Set是ES6新提供的数据结构 。它类似于数组,不过它的成员都是唯一的,没有重复值。
Set函数他可以接受一个数组,(或者是具有iterable接口的其他数据结构,讲通俗点,就是他可以接受一个可以遍历的数据类型,)作为参数,用来初始化,最后使用扩展运算符展开进数组。
所以,如果举一反三的话,Set也可以用来去除字符串里面重复字符

let test = [...new Set('aaabbbccc')].join('') // 'abc'

要是如果对Set对象感兴趣,可以看阮一峰老师的ES6教程

Array.from方法结合Set 结构去重

ES6 Array数组提供了from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 Set ),这也意味着,数组去重又可以结合数组的方法和Set对象结合完成

let data = Array.from(new Set([1, 1, 1, 2, 2, 2, 3, 3, 3, 3]))
// [1,2,3]

Array.from方法还可以接受其他参数完成更加丰富的功能,这里只是简单分享一下基本的用法。感兴趣的可去查询ES6

结语

前端开发中,提升都是在每个小片段的技术中,一个小小的数组去重还牵出蛮多的知识点,有没有长见识呢?有时候多想想为什么会带给你更多的收获😄

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值