开发者问题收集

JAvascript:如何在 for 循环中删除行时控制数组长度

2018-07-27
295

我试图删除 [i][1] 等于 0 的行。 使用下面的代码时,我遇到了错误“未捕获的类型错误:无法读取未定义的属性‘1’”,除此之外,由于对象的长度在每次更新时都会发生变化,如何在我的代码中处理这个问题?谢谢,

var arr = [['USA Canada UK', '0'],['Canada UK Australia', '1'],['UK Australia Japan', '1'],['Australia Japan India', '1'],['Japan India USA', '0'],['India USA Canada', '0'],['Canada UK India', '1'],['UK India UK', '1'],['India UK Australia', '1'],['UK Australia China', '1'],['Australia China Brazil', '1'],['China Brazil France', '1'],['Brazil France Brazil', '0'],['France Brazil France', '0'],['Brazil France Australia', '1']];

function removematch(arr){
for(var i = 0, len = arr.length; i < len; i++) {
   if(arr[i][1] == 0) {
       arr.splice(i, 1)
   }
}
    return arr;
}

console.log(removematch(arr));
3个回答

对此有几种可能的答案。

1) 使您的代码尽可能相似的方法是使用另一种方式进行迭代:

for(var i = arr.length - 1; i >= 0; i--) {

这样,删除一个元素不会影响您要处理的其余元素的位置,只会影响您已经处理的元素。

2) 另一种方法是在删除时减少长度和索引(因为下一个要处理的元素将占用已删除元素的位置):

arr.splice(i, 1); i--; len--;

3) 最有意义的方法是甚至不使用 for 循环,而是使用 filter 。这一行完成了整个代码片段的工作:

let newarr = arr.filter(element => element[1] != 0);
Amadan
2018-07-27

对于这个特定问题,我建议使用 array.prototype.filter 而不是 array.prototype.splice

691771750
fubar
2018-07-27

不要使用 len 缓存原始长度属性,只需使用 arr.length

var arr = [['USA Canada UK', '0'],['Canada UK Australia', '1'],['UK Australia Japan', '1'],['Australia Japan India', '1'],['Japan India USA', '0'],['India USA Canada', '0'],['Canada UK India', '1'],['UK India UK', '1'],['India UK Australia', '1'],['UK Australia China', '1'],['Australia China Brazil', '1'],['China Brazil France', '1'],['Brazil France Brazil', '0'],['France Brazil France', '0'],['Brazil France Australia', '1']];

function removematch(arr){
for(var i = 0; i< arr.length; i++) {
   if(arr[i][1] == 0) {
       arr.splice(i, 1)
       i--;
   }
}
    return arr;
}

console.log(removematch(arr));

我宁愿使用 .filter 来删除不匹配项。拼接是一项繁重的操作,因为它需要在每次删除后重新索引

JohanP
2018-07-27