阅读 9

数组去重

1、双重for循环

const sourceArr = [1, 1, true, true, false, false, NaN, NaN, { name: 'jack' }, { name: 'jack' }, {}, {}, undefined, undefined, null, null, [1], [1]]

for (let i = 0; i < sourceArr.length; i++) {
  for (let j = i + 1; j < sourceArr.length; j++) {
    if (sourceArr[i] === sourceArr[j]) {
      sourceArr.splice(j, 1)
      // 删除了一个 因此 j需要--
      j--
    }
  }
}

复制代码

如图所述:对象数组NaN没有去重成功,因此数组和对象虽然“长”的一样,但本质上还是不同的变量,对于NaN来说:NaN!=NaN

运行结果

2、indexOf方法

const sourceArr = [1, 1, true, true, false, false, NaN, NaN, { name: 'jack' }, { name: 'jack' }, {}, {}, undefined, undefined, null, null, [1], [1]]
const targetArr = []
sourceArr.forEach(item => {
  if (targetArr.indexOf(item) === -1) {
    targetArr.push(item)
  }
})
console.log(targetArr)

复制代码

[NaN].indexOf(NaN)===-1,[{}].indexOf({})===-1,[[]].indexOf([])===-1

运行结果

3、对象属性不能重复法

const sourceArr = [1, 1, true, true, false, false, NaN, NaN, { name: 'jack' }, { name: 'jack' }, {}, {}, undefined, undefined, null, null, [1], [1]]
const targetArr = []

const _set = {}
sourceArr.forEach(item => {
  if (!_set[item]) {
    _set[item] = true
    targetArr.push(item)
  }
})

复制代码

如果所示:数组([1])和空对象({})都被删除了

运行结果

4、Set方法

const sourceArr = [1, 1, true, true, false, false, NaN, NaN, { name: 'jack' }, { name: 'jack' }, {}, {}, undefined, undefined, null, null, [1], [1]]

const targetArr = new Set(sourceArr)
console.log(targetArr)
console.log(Array.from(targetArr))

复制代码

如图所示:使用ES6 Set语法,返回的是Set类型,对于对象和数组还是没有去重

运行结果

5、hasOwnProperty方法

const sourceArr = [1, 1, true, true, false, false, NaN, NaN, { name: 'jack' }, { name: 'jack' }, {}, {}, undefined, undefined, null, null, [1], [1]]
const obj = {}
// typeof item + item 为了区分不同变量相同的typeof
const targetArr = sourceArr.filter(item =>
  (obj.hasOwnProperty(typeof item + item)
    ? false
    : (obj[typeof item + item] = true))
)
console.log(targetArr)
复制代码

运行结果