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