文章目录
- 数组去重
- 方法一:for循环
- 算法1
- 算法2
- 方法二:filter
- 方法三:forEach
- 算法1(配合indexOf)
- 算法2(配合includes)
- 总结(indexOf跟includes的区别)
- 方法四:sort
- 算法1
- 算法2
- 算法3(sort加reduce)
- 方法5(使用Map)
- 算法1(Map)
- 算法2(Object)
- 方法6(使用Set)最简单、最推荐的一种
数组去重
方法一:for循环
注意:去重不了 NaN
算法1
复制代码
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
28var arr = [ 1,1,22,3,4,3,null, null,undefined,undefined,NaN,NaN ]; function unique(arr) { var _arr = [], isRepeat; // 唯一标识 for(var i = 0; i < arr.length; i ++) { isRepeat = false; for(var j = 0; j < _arr.length; j ++) { if(_arr[j] == arr[i]) { isRepeat = true; break; } } if(!isRepeat) { _arr.push(arr[i]); } } return _arr; } console.log(unique(arr));
算法2
复制代码
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
28var arr = [ 1,1,22,3,4,3,null, null,undefined,undefined,NaN,NaN ]; function unique(arr) { var _arr = [], isRepeat; // 唯一标识 for(var i = 0; i < arr.length; i ++) { isRepeat = false; for(var j = i + 1; j < arr.length; j ++) { if(arr[j] == arr[i]) { isRepeat = true; break; } } if(!isRepeat) { _arr.push(arr[i]); } } return _arr; } console.log(unique(arr));
算法1 相对于 算法2 快。(对,你没看错~)
方法二:filter
注意:去重不掉 NaN
复制代码
1
2
3
4
5
6function unique(arr) { return arr.filter((item, index) => { return arr.indexOf(item) === index; }) }
方法三:forEach
算法1(配合indexOf)
注意:去重不掉 NaN
复制代码
1
2
3
4
5
6
7
8
9
10
11
12function unique(arr) { var _arr = []; arr.forEach(item => { if(_arr.indexOf(item) === -1) { _arr.push(item); } }) return _arr; }
算法2(配合includes)
注意:可以去重 NaN
复制代码
1
2
3
4
5
6
7
8
9
10
11
12function unique(arr) { var _arr = []; arr.forEach(item => { if(!_arr.includes(item)) { _arr.push(item); } }) return _arr; }
总结(indexOf跟includes的区别)
- indexOf是找一个元素在数组中的下标,不存在返回-1
- includes是判断一个元素是否在数组中,返回bool值
- indexOf对NaN无效,但是includes对NaN有效
方法四:sort
算法1
注意:去重不了NaN 跟 undefined
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14function unique(arr) { var _arr = []; arr.sort(); // sort方法会改变原数组 for(var i = 0; i < arr.length; i ++) { if(arr[i] !== arr[i + 1]) { _arr.push(arr[i]); } } return _arr; }
算法2
注意:去重不了NaN
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14function unique(arr) { var _arr = []; arr.sort(); // sort方法会改变原数组 console.log(arr); for(var i = 0; i < arr.length; i ++) { if(arr[i] !== _arr[_arr.length - 1]) { // 只有这不一样 _arr.push(arr[i]); } } return _arr; }
算法3(sort加reduce)
注意:去重不了 NaN
复制代码
1
2
3
4
5
6
7
8
9
10
11
12function unique(arr) { var _arr = []; return arr.sort().reduce((prev, item) => { if(prev.length === 0 || prev[prev.length - 1] !== item) { prev.push(item); } return prev; }, []) }
方法5(使用Map)
算法1(Map)
注意:可以去重NaN
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function unique(arr) { var _arr = [], _temp = new Map(); for(var i = 0; i < arr.length; i ++) { if(!_temp.get(arr[i])) { _temp.set(arr[i], 1); // 设置键值,值可以随便设置,因为我们只用到键 _arr.push(arr[i]); } } return _arr; }
算法2(Object)
注意:可以去重NaN
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function unique(arr) { var _arr = [], _temp = new Object(); for(var i = 0; i < arr.length; i ++) { if(!_temp[arr[i]]) { _temp[arr[i]] = 1; // 设置键值,值可以随便设置,因为我们只用到键 _arr.push(arr[i]); } } return _arr; }
方法6(使用Set)最简单、最推荐的一种
注意:可以去重 NaN
复制代码
1
2
3
4
5function unique(arr) { // 利用了Set唯一值的特性 from将类数组转换为数组 return Array.from(new Set(arr)); }
最后
以上就是过时乌龟最近收集整理的关于【ECMAScript 内置对象之Array】数组去重(11种方法)的全部内容,更多相关【ECMAScript内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复