Javascript for循环跳过数组中的第一项

Javascript for循环跳过数组中的第一项,javascript,Javascript,我希望获得主体中的所有元素,然后从数组中删除具有特定类的元素。然而,for循环跳过该类的第一个元素。我添加了一些逻辑,将类添加到已删除的元素中,并保留这些元素只是为了视觉反馈。您可以运行代码段来查看它 var列表; var all=[]; var newall=[]; list=document.body.getElementsByTagName('*'); 对于(变量i=0;i

我希望获得主体中的所有元素,然后从数组中删除具有特定类的元素。然而,for循环跳过该类的第一个元素。我添加了一些逻辑,将类添加到已删除的元素中,并保留这些元素只是为了视觉反馈。您可以运行代码段来查看它

var列表;
var all=[];
var newall=[];
list=document.body.getElementsByTagName('*');
对于(变量i=0;i
。删除{文本装饰:行通过;}
.保留{背景:黄色;}

阿尔法

好极了

查理
问题是,一旦拼接元素,
j
的值就不应该增加

假设您要删除索引1(j=1)中的项,并且数组的长度为3,一旦拼接它,数组长度将变为2,索引2处的值现在位于索引1处。在下一次迭代中,将j的值增加到2,此时循环条件失败,最后一次迭代无法执行

var列表;
var all=[];
var newall=[];
list=document.body.getElementsByTagName('*');
对于(变量i=0;i
。删除{
文字装饰:线条贯通;
}
.保持{
背景:黄色;
}

阿尔法

好极了

查理
拼接会导致重新索引数组的成员,因此循环会跳过下一个成员。要避免这种情况,请从头到脚进行迭代。如果要保持结果数组中的顺序,请使用取消移位而不是推送

另外,在从数组中拼接成员之后,您将添加remove类,因此它将添加到以下成员中。所以在拼接之前添加它

var all=[];
var newall=[];
var list=document.body.getElementsByTagName('*');
var i=j=list.length;
而(我--){
全部[i]=列表[i];
}
而(j--){
if(all[j].classList.contains('div')){
//删除前添加类
all[j].classList.add('remove');
所有接头(j,1);
}否则{
//由于向后迭代,所以将成员添加到newall的开头
//以取消移动而不是以推结束
newall.unshift(all[j]);
all[j].classList.add('keep');
} 
}
。删除{文本装饰:行通过;}
.保留{背景:黄色;}
alpha
太棒了

charlie
当您从数组中拼接一个成员时,它会将所有较高的索引向下移动一个。因此,如果在递增循环中这样做,每次拼接第i个成员时,i+1成员现在是i,因此在下一次迭代中跳过它。