我是靠谱客的博主 过时乌龟,这篇文章主要介绍【ECMAScript 内置对象之Array】数组去重(11种方法),现在分享给大家,希望可以做个参考。

文章目录

    • 数组去重
      • 方法一: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
28
var 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
28
var 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
6
function 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
12
function 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
12
function unique(arr) { var _arr = []; arr.forEach(item => { if(!_arr.includes(item)) { _arr.push(item); } }) return _arr; }

总结(indexOf跟includes的区别)

  1. indexOf是找一个元素在数组中的下标,不存在返回-1
  2. includes是判断一个元素是否在数组中,返回bool值
  3. indexOf对NaN无效,但是includes对NaN有效

方法四:sort

算法1

注意:去重不了NaN 跟 undefined

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function 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
14
function 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
12
function 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
15
function 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
15
function 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
5
function unique(arr) { // 利用了Set唯一值的特性 from将类数组转换为数组 return Array.from(new Set(arr)); }

最后

以上就是过时乌龟最近收集整理的关于【ECMAScript 内置对象之Array】数组去重(11种方法)的全部内容,更多相关【ECMAScript内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部