第一种:
为数组原型添加新的方法:
Array.prototype.unique = function() {
var newArr = [];
for(var i = 0;i<this.length;i++) {
if(newArr.indexOf(this[i]) == -1) {
newArr.push(this[i]);
}
}
return newArr;
};
var arr = [1,3,1,2];
console.log(arr.unique());
函数里声明一个空数组,循环调用数组,空数组里如果不能找到循环数组的数据,则向这个空数组里面添加该数据,最后返回这个数组。
但是indexOf这个方法ie8以下支持不好,所以我们还可以这么写:
Array.prototype.unique1 = function(){
var res = [];
for(var i = 0; i < this.length; i++){
var repeat = false;//false
for(var j = 0; j < res.length; j++){
if(this[i] == res[j]){
repeat = true;
break;
}
}
if(repeat==false){
res.push(this[i]);
}
}
return res;
};
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0];
console.log(arr.unique1());
声明一个空数组,repeat一个false,然后拿arr中的每项和res中的每项对比,如果一样则返回ture,不一样则执行if那个操作,添加这个值到新数组中。
第二种:
利用排序的方法,比第一种更简洁些。
Array.prototype.unique2 = function(){
this.sort(); //先排序
var res = [];
for(var i = 0; i < this.length; i++){
if(this[i] !== res[res.length - 1]){
res.push(this[i]);
}
}
return res;
};
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0];
console.log(arr.unique2());
首先排序,排序后重复的数据会在相邻位置,用arr的第i个和空数组的最后一位做比较,如果不相等则添加到空数组中。最后返回这个数组,这么做的缺点是最后的返回值也是排序后的,如果需要和原数组同样位置的数据则不适用。
第三种:
用数组和对象做对比。
Array.prototype.unique3 = function(){
var res = [];
var json = {};
for(var i = 0; i < this.length; i++){
if(!json[this[i]]){
res.push(this[i]);
json[this[i]] = 1;
console.log(json);
}
}
return res;
};
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
console.log(arr.unique3());
建立一个空数组和空对象,循环这个数组,到对象中匹配数组中的元素,如果不存在,则在空数组中添加这个元素,在空对象中添加这个key并随便给个值。
更多请关注:FE学习笔记