2

我正在用我的菜鸟头撞墙...

我有以下代码:

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" 参数有关......它似乎正在跳过后续数组每次它拼接时,但我无法完全解决问题。

请有人引导我正确:)

4

3 回答 3

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

更多关于filterMDN 上的 Array 方法:Array filter method

于 2013-04-10T02:39:57.503 回答
3

就地修改数组并不总是很糟糕。如果您决定这样做,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);
于 2013-04-10T02:42:43.793 回答
1

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

如果您检查元素#1 并决定删除它,那么当您检查#2 时,您实际上是在检查#3。

于 2013-04-10T02:40:36.243 回答