分享两种js中数组去重的方法

2019-09-26  本文已影响0人  超人鸭

对于数组项为基本类型(基本为数字或字符串)的:

var arr = [1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 7]
function fn(arr) {
  return arr.filter((x, index, self) => self.indexOf(x) === index)
}

比较简单粗暴,利用indexOf只会找到第一个匹配项的下标这个特性,忽略重复的数组项。

var arr = [1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 7]
function fn(arr) {
  let hashTable = {}
  let data = []
  for (let i = 0; i < arr.length; i++) {
    if (!hashTable[arr[i]]) {
      hashTable[arr[i]] = true
      data.push(arr[i])
    }
  }
  return data
}

利用了对象的key值去重,当然,对于这种数组项为基本类型的数组,去重还有很多方法,es6出了Set这种数据类型,对普通数组的去重更是简单粗暴。

但在工作中,去重的需求并不是那么简单,往往数组是一个对象数组,然后根据其中的某一个字段去重,对于这种需求,我们还是可以用上面的方法,利用对象的key值去重:

let arr1 = [{id: 1}, {id: 2}, {id: 3}, {id: 4}]
let arr2 = [{id: 5}, {id: 2}, {id: 3}, {id: 8}]
// 比如这个,两个数组合并然后根据id这个字段去重
function fn(arr1,arr2){
  let arr = arr1.concat(arr2)
  let hashTable = {}
  let data = []
  for (let i = 0; i < arr.length; i++) {
    if (!hashTable[arr[i].id]) {
      hashTable[arr[i].id] = true
      data.push(arr[i])
    }
  }
  return data
}

觉得这个利用key值的方式还是挺万能的,之后看到还有好的方式超人鸭也会继续添加在这篇文章里面。

上一篇下一篇

猜你喜欢

热点阅读