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 フィルター メソッド

于 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 に答える