数组去重.md

#数组去重

大方向啊,先考虑非嵌套数组去重。

然后拓展题, 尝试一下先写测试的函数:

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
const test = (fn, arg, result) => {
// 绝对是一个新的思路呢
}

// 解:

// em....我们可以使用, ES6的set
const unit1 = arr => {
return new Set(arr);
}

unit1([1, 2, 3, 1]);

//em....reduce.
const unit2 = arr => {
return arr.reduce((result, item) => {
result.includes(item) ? result : result.push(item);
return result;
}, [])
}

unit2([1, 2, 3, 1, NaN, NaN, -0, 0, +0, null, null]);


// em....map, 感觉和reduce一样一样的, 不写了。
// em....for.
const unit3 = arr => {
const result = []
arr.map(item => {
result.includes(item) ? void 0: result.push(item);
});
return result;
}

unit3([1, 2, 3, 1, NaN, NaN, -0, 0, +0, null, null]);

// em...对象的key值不能重复可以利用一下.
const unit4 = arr => {
let result = [];
let obj = {};
arr.map(item => {
obj[item] = null;
})
for(i in obj) {
result.push(i)
}

return result;
}
unit4([1, 2, 3, 1, NaN, NaN, -0, 0, +0, null, null]);

往深的看,嵌套数组去重.往深了走.

  1. 包含数组

  2. 包含对象

那么子问题是, 如何判断一个对象是不是相同.

数组其实就递归使用上面的方法就好呀.

但是再往深的看,其实这里如果自己写判断相等的函数还是涉及到一些坑, 比如类型。js的类型判断有几个坑, 比如-0, NaN, 所以我墙裂推荐大家使用数组的includes方法,它本身的实现已经考虑到js变态的类型机制了。当然你完全可以自己写判断两个元素是否相等的函数, 这绝对没问题.