一.一维数组去重
var arr=[1,2,1,2];
//定义一个空数组
var arr1=[];
//遍历原始数组,若新数组中没有这个元素,那么就将该元素添加到新数组中
for (var i=0;i<arr.length;i++){
if (arr1.indexOf(arr[i])==-1){
arr1.push(arr[i]);
}
}
console.log(arr1);//[1,2]
二.二维数组去重
方法一:二维数组中,是否可以用上面的方法呢?答案是否定的。js的indeOf啊返回字符串字符或数组中某个元素的位置,它的内部是遍历这个数组看是否有与之相等元素,而[1,2]==[1,2]返回的false,数组是不能直接进行比较的,若比较一个数组是否相同,可将其转换为字符串再进行比较,即[1,2].toString()==[1,2].toString返回的是true。
为之奈何?我们可以自己写个类似indexOf的方法,来判断一维数组在二维数组的位置,当然也可以判断出n维数组在n+1维数组中的位置。
function getEleIndex(ele,arr) {
for (var i=0;i<arr.length;i++){
//判断该值是否为undefined,因为undefined.toString()会报错
if(arr[i]){
if (arr[i].toString()==ele.toString()){
return i;
//一旦找到这个元素就跳出循环,否则会把所有的位置都遍历到
break;
}
}
}
//找不到该元素就返回-1
return -1;
}
var arr=[];
console.log(getEleIndex([1, 2], arr));
那么,二维数组去重的问题也就迎刃而解了。上述方法中,若遍历一个空数组,则arr.leng为0,直接跳出循环返回-1。
var arr=[[1,2],[1,2],[2,3],[1,2],[1,3],[2,3]];
var arr1=[];
for (var i=0;i<arr.length;i++){
if(getEleIndex(arr[i],arr1)==-1){
arr1.push(arr[i]);
}
}
console.log(arr1);//[1,2],[2,3],[1,3]
方法二:除了上种方法,还可以通过借助一个空的object来实现,代码比上面那种方法要少。
function removeRepeatEle(arr) {
var newArr=[];
var hash={};
for (var i=0;i<arr.length;i++){
/*判断这个对象是否有这个键,若没有,将这个值push进newArr里面,并且给这个键赋值为true,等再遇见
相同的值时,这个if语句就不能满足,就会遍历下一个*/
if(!hash[arr[i]]){
newArr.push(arr[i]);
hash[arr[i]]=true;
}
}
return newArr;
}
var test=[[1,2],[1,2],[2,3]];
console.log(removeRepeatEle(test));//[1,2],[2,3]
该方法其实与方法一思想相同,都是通过遍历数组的每个元素,看该元素是否是唯一的,若是唯一就push进空数组中,只不过第二种方法是借助一个空对象来判断该元素是否唯一。