我正在敲打我的那个木头撞在墙上......
我有以下代码:
var guns2 =
[
["Model 17", "Glock"],
["Model 19", "Glock"],
["PPQ", "Walther"],
["P2000", "HK"],
["Model 92", "Beretta"],
["Model 34", "Glock"]
]
var gunsMake = function () {
for (i=0; i<guns2.length; i++){
var make = guns2[i][1];
if (make ==="Glock"){
}
else {
guns2.splice(i,1);
}
};
};
gunsMake();
console.log(guns2);
我在控制台中获得的结果如下:
[["Model 17", "Glock"], ["Model 19", "Glock"], ["P2000", "HK"], ["Model 34", "Glock"]]
我希望看到的是:
[["Model 17", "Glock"], ["Model 19", "Glock"], ["Model 34", "Glock"]]
“[”P2000“,”HK“]”不应该在那里......我感觉它与for循环中的“guns2.length”参数有关..看起来它每次拼接时都会跳过后续数组,但我无法完全修复我的大脑。
请有人指导我:)
答案 0 :(得分:6)
在迭代时修改数组通常不是一个好主意,因为很难跟踪索引和退出条件。将所需结果插入单独的数组中,或使用本机filter
方法返回已过滤的数组。
var gunsMake = function (guns, desiredMake) {
return guns.filter(function(v,i,a){
return v[1] == desiredMake;
});
};
guns2 = gunsMake(guns2, "Glock");
console.log(guns2);
有关MDN上的数组filter
方法的更多信息:Array filter method
答案 1 :(得分:3)
在原地修改阵列并不总是很糟糕。如果您决定这样做,请在删除元素时减少i
。
var guns2 =
[
["Model 17", "Glock"],
["Model 19", "Glock"],
["PPQ", "Walther"],
["P2000", "HK"],
["Model 92", "Beretta"],
["Model 34", "Glock"]
]
var gunsMake = function () {
for (i=0; i<guns2.length; i++){
var make = guns2[i][1];
if (make ==="Glock"){
}
else {
guns2.splice(i--,1); // Decrement i here
}
};
};
gunsMake();
console.log(guns2);
答案 2 :(得分:1)
当您使用固定索引循环遍历数组时,您正在删除(拼接)数组。所以,你没有检查所有的元素。
如果您检查元素#1并决定删除它,那么当您检查#2时,您实际上正在检查#3。