数组去重全姿势

总结一下数组去重的几种方式,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
var arr = [1, 1, 2, '1']

// 双层循环
function unique1(arr) {
var res = []
for (var i = 0, arrLen = arr.length; i < arrLen; i++) {
for (var j = 0, resLen = res.length; j < resLen; j++) {
if (arr[i] === res[j]) {
break
}
}
// 如果array[i]是唯一的,那么执行完循环,j等于resLen
if (j === resLen) {
res.push(arr[i])
}
}
return res
}

// indexOf
function unique2(arr) {
var res = []
for (var i = 0, arrLen = arr.length; i < arrLen; i++) {
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res
}

// 排序后去重
function unique3(arr) {
var res = []
var sortedArr = arr.concat().sort()
var seen
for (var i = 0, arrLen = sortedArr.length; i < arrLen; i++) {
// 如果是第一个元素或者相邻的元素不相同
if (i === 0 || seen !== sortedArr[i]) {
res.push(sortedArr[i])
}
seen = sortedArr[i]
}
return res
}

// filter中with indexOf
function unique4(arr) {
var res = arr.filter(function(item, index, array) {
return array.indexOf(item) === index
})
return res
}

// filter中with 排序后去重
function unique5(arr) {
var res = arr
.concat()
.sort()
.filter(function(item, index, array) {
return index === 0 || item !== array[index - 1]
})
return res
}

// Object键值对(对象去重)
function unique6(arr) {
var res = []
var obj = {}
for (var i = 0, arrLen = arr.length; i < arrLen; i++) {
var item = arr[i]
// 因为对象的键值对只能是字符串,防止1和'1'的情况,所以采取一个typeof加类型的方法来区分
// 然而还是无法区分两个对象,比如 {value: 1} 和 {value: 2},因为 typeof item + item 的结果都会是 object[object Object]
// 所以我们可以使用 JSON.stringify 将对象序列化转化成字符串
if (!obj[typeof item + JSON.stringify(item)]) {
obj[typeof item + JSON.stringify(item)] = true
res.push(item)
}
}
return res
}

// Object键值对with filter
function unique7(arr) {
var obj = {}
return arr.filter(function(item, index, array) {
return obj.hasOwnProperty(typeof item + JSON.stringify(item))
? false
: (obj[typeof item + JSON.stringify(item)] = true)
})
}

// ES6 Set
function unique8(arr) {
return Array.from(new Set(arr))
// return [...new Set(arr)];
}

// ES6 Map
function unique9(arr) {
const seen = new Map()
return arr.filter(a => !seen.has(a) && see.set(a, 1))
}

console.log(unique6(arr))