面对数组去重,我们用什么方式

不管是面试还是平时写程序的过程中我们经常会遇到要对数组进行去重的问题,该文总结了一些常见的数组去重的方法。

对象键值对法

思路:新建一js对象json以及新数组reArr,遍历数组元素是否为json的键,不是则创建,是则判断元素的类型在键对应的值中是否存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function unique(array){
var json = {}, reArr = [], len = array.length, val, type;
for (var i = 0; i < len ; i++) {
val = array[i];
type = Object.prototype.toString.call(val);
if (!json[val]) {//如果键对应的值不存在则是第一次存取
json[val] = [type];//设置该键为数组,并赋值元素类型
reArr.push(val);//往reArr中添加元素
} else if (json[val].indexOf(type) < 0) {
json[val].push(type);
reArr.push(val);
}
}
return reArr;
}
//该方法有bug,当有多个{}时,只能保存一个{}

测试
unique1测试

遍历数组法

思路:新建一新数组,遍历传入的数组,值不在新数组就加入该新数组中;该方法最主要的是要使用ES5中的indexOf方法。但是ie8一下不支持,所以需要做一些兼容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (!Array.prototype.indexOf){
Array.prototype.indexOf = function(item){
if (this.length == 0){
return -1;
}
for(var i = 0, len = this.length; i < len; i++){
if (this[i] === item){//注意是三个等号
return i
break;
}
}
return -1;
}
}

去重代码

1
2
3
4
5
6
7
8
9
function unique(array){
var reArr = [];
for(var i = 0; i < array.length; i++){
if (reArr.indexOf(array[i]) == -1){//判断元素是否在数组中已经存在
reArr.push(array[i]);
}
}
return reArr;
}

测试
遍历数组法测试

数组下标判断法

思路:将传入的数组的第一项目添加到一个新的数组,后遍历传入的数组中的元素利用indexOf方法,若返回值与循环中的索引不同则是重复的元素。

1
2
3
4
5
6
7
8
9
10
function unique(array){
var reArr=[];
reArr[0]=array[0];
for(var i=1;i<array.length;i++){
if(array.indexOf(array[i])==i){
reArr.push(arrar[i]);
}
}
return reArr;
}

测试
遍历数组下表法测试

排序后相邻去除法

思路:先将数组经过sort排序,这时候相同的元素处于相邻的位置,所以在便利数组的时候我们只将与前一值不重复的值

1
2
3
4
5
6
7
8
9
10
11
function unique(array){
var reArr=[array[0]];
var len=array.length;
array.sort();
for(var i=1;i<len;i++){
if(array[i]!=reArr[reArr.length-1]){//注意这里
reArr.push(array[i]);
}
}
return reArr;
}

测试
排序后相邻去除法