原本的正确写法:
我改了之后的:
箭头部分是改动的。
源代码:
正确写法:
var ary=[1,2,34,56,6,7,45,3,2,2,12,4,9,8,6,7,4];
function deleteRepeat(ary){
var obj={};
for(var i= 0,len=ary.length;i<len;i++){
var temp=ary[i];
if(obj[temp]==temp&&temp!=undefined){
ary.splice(i,1);
i--;
continue;
}
obj[temp]=temp;
}
obj=null;
return ary;
}
var newAry=deleteRepeat(ary);
console.log(newAry);
改过之后:
var ary=[1,2,34,56,6,7,45,3,2,2,12,4,9,8,6,7,4];
function deleteRepeat(ary){
var obj={};
for(var i= 0,len=ary.length;i<len;i++){
var temp=ary[i];
if(obj[temp]){ //试了下,如果把这里改成if(obj[temp]&&temp!=undefined),就能正确运行,但我不知道这样写的用处。按理来说,如果temp=undefined,obj[temp]也就等于undefined了,后面的代码根本不会执行
ary.splice(i,1);
i--;
continue;
}
obj[temp]=1;
}
obj=null;
return ary;
}
var newAry=deleteRepeat(ary);
console.log(newAry);
谢邀~
又++ 又-- 死循环了呗,
如果不判断 arr[i]!=undefined 空数组的时候就会死循环,
比如测试用例:
[1,1,1,1];
真逗, 请问是哪位踩得我, 哪句说的不对?
题主问的
服务器卡死是为什么? 除了我有一个人说的是为什么卡死吗?
既然这么不开窍,
我再解释一下为什么会死循环~
还是拿测试用例[1,1,1,1];
第一次循环对应数组index为0 value为1
第一次进来obj肯定为空, 缓存一个{1: 1};
第二次循环数组index为1 value为1;
判断出有一个value为 1(obj : {1: 1});
则对数组删除index为1的数据.
同时对i--, 当进入下一次循环的时候i又++, 所以可以理解到下次循环i不变,i为1
第三次循环同理,i为1
第四次进入循环时i为1,
但是arr的长度为1,则 arr[1]为undefined,
但是没有判断是否为undefined,
直接判断obj[undefined]因为不存在直接跳出到
obj[temp]=1;此时temp为undefined
即为把obj声明一个属性为undefined值为1
Object {1: 1, undefined: 1}
第五次循环
i为2
同样数组中只有一个值所以arr[i]还是undefined;
但是obj[undefined]为1,
所以再去删除数组, (当前数组为空);
同时i--;
直到正无穷~