数组去重的一些记录

多年的工作,我也没有用到这个知识(应该是自己比较菜),但这东西一直在面试里出现,看到别的总结的都是一两个点,所以打算自己总结一下,给自己备用~

使用Set

Set是ES6中新的数据结构,它类似数组,但数据成员都是唯一的,没有重复的值。

Set实际是一个构造函数,用来生成Set,我们可以传入一个数组来生成:

1
2
3
4
5
6
7
let test1 = { name: 'test1'}
let test2 = test1
let test3 = { name: 'test3' }
let arr = ['🙄', '🙄', 1, 3, 1, 5, '1', test1, test3, test2]

// 生成set.
let arrSet = new Set(arr)

再把Set变回数组有两种办法:

  1. 一种是利用Array.from
  2. 一种是...解构
1
2
3
4
// 第一种.
console.log(Array.from(new Set(arr)))
// 第二种.
console.log([...new Set(arr)])

利用filterindexOf

1
2
3
4
5
let arr = ['🙄', '🙄', 1, 3, 1, 5, '1', test1, test3, test2]
let newArr = arr.filter((item, index) => {
return arr.indexOf(item) === index
})
console.log(newArr)

利用reduceincludes

1
2
3
4
5
let arr = ['🙄', '🙄', 1, 3, 1, 5, '1', test1, test3, test2]
let newArr = arr.reduce((unique, item) => {
return unique.includes(item) ? unique : [...unique, item]
})
console.log(newArr)

利用对象key值

这种方法的局限性就到了,一般都是值有重复的数字或字符串

1
2
3
4
5
6
7
8
9
10
11
let obj = {}
let newArr = []
let arr = ['🙄', '🙄', 1, 3, 1, 5, '1']

for (let i = 0, len = arr.length; i < len; i++) {
if (!obj[arr[i]]) {
newArr.push(arr[i])
obj[arr[i]] = 1
}
}
console.log(newArr)

其余都是利用多次循环来做到去重,暂时就这样了~

待续吧~ 我要为祖国母亲庆生~

给祖国母亲庆生完了,老实的搬砖~