JS多维数组去重(对象键名⽐较法+indexof)昨天在复习的时候看了下数组去重的⽅法,然后测试了下这些数组去重⽅法优缺点,其中结合两种去重⽅法(对象键名⽐较法、indexof)的优点,⾃⼰写了个多维数组的去重。这个⽅法能够去除基本类型,多维数组,函数,null,undefined的重复项。如果有错误的地⽅或者有其他更好的⽅法可以留⾔告诉我,我是萌新(〃'▽'〃),⼤佬勿喷。
function unique(array){
var obj = {},
result = [],
len = array.length;
for(var i = 0; i<len; i++){
if(String.call(array[i])=='[object Array]'){
if(!obj[array[i]]){
obj[array[i]] = 'seat'; //seat占位没有具体作⽤
result.push(unique(array[i])); //递归再次过滤
}
}else{
if(result.indexOf(array[i]) == -1){
result.push(array[i]);
}
}
}
return result;
}
为了验证,写了个数组进⾏测试
function b(){};
var Arr = ['b','b',b,b,null,null,undefined,undefined,'2',2,2,'[2,3]',[2,3],[4,4,[5],[5]],[6,[7,8]],[6,[7,8]]];
控制台打印结果
接下来,分析下这两种⽅法的优缺点:
1.对象键名⽐较法,利⽤对象的属性名不能有重复的效果,把数组的值当作对象的属性名
function unique1(array){
var obj = {},
arr = [];
for(var i = 0; i<array.length; i++){
if(!obj[array[i]]){
obj[array[i]] = 'seat';
arr.push(array[i]);
}
}
return arr;
}
function b(){};
var Arr = ['b','b',b,b,null,null,undefined,undefined,'2',2,2,'[2,3]',[2,3],[4,4,[5],[5]],[6,[7,8]],[6,[7,8]]];
控制台打印结果
从上⾯结果可以看出,这个⽅法对于number和其对应的字符串形式⽆法过滤,谁在前⾯谁就保留下来。
2.indexof ,查值的位置,值不在新数组就push进该新数组中
function uniquarre2(array){
var arr = [];
for(var i = 0; i < array.length; i++){
if(arr.indexOf(array[i]) == -1){
arr.push(array[i]);
}
}
return arr;
}
function b(){};
var Arr = ['b','b',b,b,null,null,undefined,undefined,'2',2,2,'[2,3]',[2,3],[4,4,[5],[5]],[6,[7,8]],[6,[7,8]]];
控制台打印结果
从上⾯结果可以看出,这个⽅法恰好弥补了上⼀个⽅法的缺陷。但对于相同数组[6,[7,8]]⽆法过滤,不
过这个缺陷可以⽤上⼀个⽅法来弥补。
所以在综合这两个⽅法的时候,⾸先判断数组元素的类型进⽽选择适合的⽅法
js 二维数组1.对于数组类型在选⽤ 对象键名⽐较⽅法 过滤的基础上,在push进新数组的时候使⽤递归,再次过滤⼆维数组内的重复项,以此类推。
2.对于其他类型选⽤ indexof⽅法 过滤
待改进:这个⽅法没做相同对象的过滤,所以在遇到相同对象时,会被全部保留下来,不做过滤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。