2 zzzcsd zzzcsd 于 2016.04.11 15:00 提问

循环遍历过程中,删除数组的元素?
 for(var i=0,len=arr.length; i<len; i++){
      if(符合条件){
                  arr.splice(i);
            }
}

像上面这样,在遍历过程中,删除某个元素,会存在问题,可能导致某些元素没有机会被遍历。
这个算法应该如何改进?

7个回答

showbo
showbo   Ds   Rxr 2016.04.11 15:05
  for(var i=0,len=arr.length; i<len; ){
      if(符合条件){
                  arr.splice(i);
            }
                        else i++;///////
}

或者从后面开始遍历,就不需要在程序里面控制i

 for(var i=arr.length-1;i--;i>=0)
CSDNXIAON
CSDNXIAON   2016.04.11 15:12

js数组循环遍历数组内所有元素
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

kenrry1992
kenrry1992   2016.04.11 15:16

按理说 你这个代理存在越界崩溃的问题 当移除一个元素的时候,你实际数组的arr的长度发生改变 实际遍历的次数会越界导致崩溃,
一般需删除的话我会将角标i记录至另外的数组,当循环结束后,在统一的删除

qq_18332445
qq_18332445   2016.04.11 15:23

你这问题很明显啊,先说原因,你删除第i个元素的时候,第i+1个元素就变成了第i个,当你接着访问第i+1个元素的时候,实际上已经是访问原本的第i+2个元素了,因此就漏掉了一个。
不光是有些遍历不到,到后面还有可能访问越界,我建议你还是从后往前处理吧。
如果实在想从前往后遍历,if语句里面加两行代码,变成:arr.splice(i); i--; len=arr.length;

wbjylk
wbjylk   2016.04.11 15:46

你应该先弄清楚javascript中splice()的定义和用法。

seek_knowledge_lulu
seek_knowledge_lulu   2016.04.11 17:20

你把这个要删除的元素下标,存到一个新的集合里,然后遍历这个集合,通过这个集合里的下标,去删除原集合的元素,就ok了
int i=0;
List l=new ArrayList();
for(String s:list)
{
if(s=="要删除的元素")
{
l.add(i);
i++;
}

}

//删除指定的元素
for(int n:l)
{
list.remove(n);
}

seek_knowledge_lulu
seek_knowledge_lulu   2016.04.11 17:21

我是用java写的,希望对你有帮助

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!