数组去重
面试官让我写一个简单的数组去重,结果我吭哧吭哧写半天,嵌套了两层for循环,竟然还把自己写迷了,深切的感受到面试官已经不想跟我再聊下去了。
我当时的写法真的是太糟了,就不贴出来误导别人了,还是看正确的吧。
1.两层for循环,依次比较后面所有项是否相同。
var myArray = [1,2,3,4,5,2];
function getArray(array){
var newArray = [];
for(var i = 0,l = array.length; i < l; i++){
for(var j = i + 1; j < l; j++){
if(array[i] === array[j]){
j = ++i;
}
}
newArray.push(array[i]);
}
return newArray;
}
console.log(getArray(myArray));
从数组中第0位开始于后面的数做比较,如果相等就跳过,再与下一个比较,如果不相同则push到newArray中保存,最后返回newArray。
再次尝试for循环,学习并理解Array的indexOf方法;
if(!Array.prorotype.indexOf){ // 假设indexOf方法不存在
Array.prototype.indexOf = function(item){
var result = -1, a_item = null;
var len = this.length;
if(len == 0){
return result;
}
for(var i = 0; i < len; i++){
a_item = this[i];
if(a_item === item){
result = i;
break;
}
}
return result;
}
}
2.所以就有了使用indexOf()方法的去重。
function getArray(array){
var newArray = [];
for(var i = 0; i < array.length; i++){
if(newArray.indexOf(array[i]) == -1){
newArray.push(array[i]);
}
}
return newArray;
}
var myArray = [1,2,3,4,5,2];
console.log(getArray(myArray));
首先newArray数组里面并没有值,所以执行indexOf的时候讲原数组中第0项放到newArray中,接下来依次查看下一项是否存在在newArray中,不存在就push进去,所以就得到了去掉重复元素的数组。理解思路也比我的第一个方法简单直接了许多。但是indexOf是ECMAScript5的方法,IE8以下不支持,所以就能用上面我自己写的indexOf方法兼容低版本浏览器啦。
3.学习了map遍历函数
var arr = [1,2,3,4,5,2,3,2];
function getArray(arr){
var newArr = [];
arr.map(function(item,index,arr){
if(arr.indexOf(item,index+1) == -1){
newArr.push(item)
}
})
return newArr;
}
console.log(getArray(arr));
也可以正确讲数组去重了。这里forEach、filter方法也可以实现。从传入参数的下一个索引开始寻找是否存在重复。
--------(添加于2017年06月14日17:42:27)
4.最直接的去重方式
var arr = [1,2,3,4,5,2,3,2];
function getArray(arr){
return arr.filter(function(item,index,array){
return array.indexOf(item) === index;
})
}
console.log(getArray(arr));
// [1, 2, 3, 4, 5]
编辑于 2017-06-14 17:44