JavaScript 數組去重

作者 Calpa 日期 2017-05-05 共259字

顧著做化工模擬功課,差點忘記怎樣寫代碼。。。

內置方法

使用JavaScript內置的去重複方法Set(),比如說:

1
2
3
let arr = [1, 2, 3, 3, 4, 5];
Array.from(new Set(arr)); // [1, 2, 3, 4, 5]
[...new Set(arr)]; // [1, 2, 3, 4, 5]

第一時間會想到的方法

  1. 雙重遍歷
  2. 使用hash table

Underscore

最後來看一下underscore是如何實現unique()方法吧。

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
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
// 如果數組不是已經排序
if (!_.isBoolean(isSorted)) {
// 將function(array, isSorted, iteratee, context)
// 換成function(array, false, isSorted, iteratee)
context = iteratee;
iteratee = isSorted;
isSorted = false;
}
// 如果存在iteratee
if (iteratee != null) iteratee = cb(iteratee, context);
var result = [];
var seen = [];
for (var i = 0, length = getLength(array); i < length; i++) {
var value = array[i],
computed = iteratee ? iteratee(value, i, array) : value;
// 如果已經排序,就直接增加數值(第一個值)。
// 非0 就是 true
// 或者see不是computed
if (isSorted) {
if (!i || seen !== computed) result.push(value);
seen = computed;
} else if (iteratee) {
// 使用_.contains查詢數組裡面是否擁有這個值
if (!_.contains(seen, computed)) {
seen.push(computed);
result.push(value);
}
} else if (!_.contains(result, value)) {
result.push(value);
}
}
return result;
};