数组去重

面试官让我写一个简单的数组去重,结果我吭哧吭哧写半天,嵌套了两层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