js-数组的 去重 和 扁平化

526 阅读2分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

数组的 去重 和 扁平化

介绍

数组去重 ,通过名字可以知道,是将数组里面重复的数据进行去重复操作。

数组扁平化,这个通过名字,可能不太好理解,可是看到实际案例就可以明白它的含义是什么了。

介绍这两个的意义,在于 平时的项目中,有很多地方用到 数组去重数组扁平化 这两种操作方式。既然经常使用,那么这里总结一下相关使用方法和代码。

数组去重

  • 首先是es6方法的 数组去重 操作
    const unique = (arr) => {
      return Array.from(new Set(arr))
    }

但是此方法会有一个问题就是,无法去掉重复的对象 {}

const array = [1,2,1,true,false,true,'1','2','1',undefined,undefined,null,null,{},{},NaN,NaN,{a:1},{a:1}]

res = [1, 2, true, false, '1', '2', undefined, null, {}, {}, NaN, { a: 1 }, { a: 1 }]

可以看到 无法对对象进行处理

  • 通过双重for循环来进行

给定待处理数据为分别为 基本类型,引用类型(包括特殊情况)

const arr = [
  1,
  2,
  1,
  '1',
  '2',
  '1',
  true,
  false,
  true,
  'true',
  'false',
  'true',
  undefined,
  undefined,
  'undefined',
  'undefined',
  null,
  null,
  'null',
  'null',
  Symbol('111'),
  Symbol('111'),
  "Symbol('111')",
  "Symbol('111')",
  111n,
  111n,
  '111n',
  '111n'
]

const arr2 = [NaN, NaN, 'NaN', 'NaN', {}, {}, '{}', '{}', { a: 1 }, { a: 1 }, '{ a: 1 }', '{ a: 1 }', [], [], '[]', '[]', [1], [1], '[1]', '[1]']

const unique = (arr) => {
  for (let i = 0, len = arr.length; i < len; i++) {
    for (let j = i + 1, len = arr.length; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1)
        j-- // 每删除一个数j的值就减1
        len-- // j值减小时len也要相应减1(减少循环次数,节省性能)
        // console.log(j,len)
      }
    }
  }
  return arr
}
console.log(unique(arr))

结果可以看到对 数组内的 引用类型 数据的去重,效果并不好

const res1 = [1, 2, '1', '2', true, false, 'true', 'false', undefined, 'undefined', null, 'null', Symbol(111), Symbol(111), "Symbol('111')", 111n, '111n']

const res2 = [NaN, NaN, 'NaN', {}, {}, '{}', { a: 1 }, { a: 1 }, '{ a: 1 }', [], [], '[]', [1], [1], '[1]']

数组扁平化

意思就是将数组内。如果该数组内还有其他的数组对象,那么就将里面的数组对象取出来。如果取出来的还是数组对象的话,那么就继续取出来,直到数组的里面,没有数组对象。这就是 数组扁平化

  • 通过reduce方法来进行

通过 遍历数组 的每一项,如果当前值为数组的话,进行递归操作,否则concat。


const flatten = (arr) => {
  return arr.reduce((result, item) => {
    return result.concat(Array.isArray(item) ? flatten(item) : item)
  }, [])
}

通过递归的方式,可以很好的处理扁平化的问题

总结

数组去重 可以帮助我们处理很多不必要的数据,推荐 es6 的 Set 方法去重

数组扁平化 这里也是推荐使用es6 的 ... 操作符来进行数组的扁平化