使用for循环从多维数组中移除元素时遇到麻烦



我在这件事上简直是白费功夫…

我有以下代码:

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","香港")"不应该有……我有一种感觉,这和"枪"有关。长度"参数在for循环中…似乎它跳过了后面的数组每次拼接,但我不能完全把我的大脑围绕一个修复。

请给我指路吧

在迭代数组时修改它通常不是一个好主意,因为很难跟踪索引和退出条件。要么将期望的结果插入到一个单独的数组中,要么使用原生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上的Array filter方法的更多信息:Array filter方法

就地修改数组并不总是很糟糕。如果您决定这样做,则在删除元素时减少i

http://jsfiddle.net/kVzLn/

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

当您使用固定索引循环时,您正在从数组中删除(拼接)节点。所以,你没有检查所有的元素。

如果你选中了元素#1并决定删除它,那么当你选中元素#2时,你实际上选中了元素#3。

相关内容

  • 没有找到相关文章