簡體   English   中英

使用for循環(javascript)從多維數組中刪除元素時遇到問題

[英]Trouble removing elements from multidimensional array using for loop (javascript)

我正在敲打我的那個頭部靠近牆壁...

我有以下代碼:

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”參數有關。看起來它正在跳過后續數組每次拼接,但我無法完全修復我的大腦。

拜托,有人引導我吧:)

在迭代時修改數組通常不是一個好主意,因為很難跟蹤索引和退出條件。 將所需結果插入單獨的數組中,或使用本機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方法的更多信息: 陣列過濾器方法

在原地修改陣列並不總是很糟糕。 如果這是您決定要做的事情,請在刪除元素時減少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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM