数组去重
Jonnzer Lv4

我们时常遇见数组去重的需求,或是后台给的数据重了,或是前端生成数据的时候重了,这时候往往需要处理下,那下面我归纳下各种解决方案吧🧐:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 先给出几组测试数组
let includeObjArr = [ // 待检测数组(含对象)
{
id: 11,
name: 'wang'
},
{
id: 11,
name: 'wang'
},
{
id:12,
name: 'zhong'
},
{
id: 11,
name: 'zhong'
}
];
let includeNumArr = [3, 62, 3, 38, 20, 42, 14, 5, 38, 29, 42]; // 只含数字的简单数组

1. 利用ES6的API Set和 Array

1
2
3
4
5
6
7
8
/*
* es6 api的解决方案
* @param targetArr
* @returns {any[]}
*/
function uniqueArray(targetArr){
return Array.from(new Set(targetArr));
}
结论:只能用于包含简单数字的数组去重

2. 利用array.splice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
* es6 api的解决方案
* @param arr
* @returns {any[]}
*/
function uniqueArray(arr){
for(var i = 0; i < arr.length - 1; i++){
for(var j = i + 1; j < arr.length; j++){
if(arr[j] === arr[i]){
arr.splice(j--, 1);
}
}
}
return arr;
}
结论:只能用于包含简单数字的数组去重

3. 利用哈希表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 对象存储的是引用而原始变量存储的是值。
* 因为哈希表在Javascript里是一个简单的Object,它的key永远是String类型。这意味着我们不能区分字符串和数字表示的相同的值,如1和'1'。
* 然而,因为我们使用的JSON.stringify,String类型的key 将会被存储为一个字符串值,这样hashTable的key就唯一了。
* 这意味着相同的值,但不同类型的元素,将以原来的格式保留。
* @param arr
* @returns {Array}
*/
function dedup(arr) {
var hashTable = {};

return arr.filter(function (el) {
var key = JSON.stringify(el);
var match = Boolean(hashTable[key]);

return (match ? false : hashTable[key] = true);
});
}

结论:可用于包含复杂类型的数组去重

4. 利用对象中key的唯一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function unique(arr) {
var ret = [];
var len = arr.length;
var tmp = {};
var tmpKey;
for(var i=0; i<len; i++){
tmpKey = typeof arr[i] + JSON.stringify(arr[i]);
if(!tmp[tmpKey]){
tmp[tmpKey] = 1;
ret.push(arr[i]);
}
}
return ret;
}
结论:可用于包含复杂类型的数组去重
参考链接:

jstips
blog
blog

  • 本文标题:数组去重
  • 本文作者:Jonnzer
  • 创建时间:2019-02-25 15:53:23
  • 本文链接:https://jonnzer.github.io/2019/02/25/数组去重/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论