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

时间:2018-07-27 02:07:40

标签: javascript arrays

我正在尝试删除[i] [1]等于0的行。 在下面的代码中,我有一个错误“未捕获的TypeError:无法读取未定义的属性'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 个答案:

答案 0 :(得分:4)

对此有几种可能的答案。

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);

答案 1 :(得分:3)

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

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(array) {
  return array.filter(function (row) {
    return row[1] !== '0';
  });
}

console.log(removeMatch(arr));

答案 2 :(得分:1)

不要使用len缓存原始的length属性,只需使用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删除不匹配的内容。拼接是一项繁重的操作,因为它需要在每次删除后重新索引