簡體   English   中英

從JavaScript數組中移除項目,同時對其進行循環

[英]Removing items from a javascript array while looping over it

我有兩個JavaScript數組。 對於第一個數組中的每個項目,我需要檢查第二個數組中是否存在該項目,如果存在,則應從第二個數組中刪除該項目。 我不想創建另一個數組。 在過程結束時,我應該有第二個數組,其值正確。 使用下面的代碼,我無法獲得所需的結果。

var arr = [1, 2, 3];

var childArr = [1, 2, 3, 4, 51, 2, 3, 5];

for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < childArr.length; j++) {
        if (childArr[j] === arr[i]) {
            childArr.splice(childArr[j], 1);
        }
    }
}

您正在嘗試創建“數組差異”算法的實現,可以使用Array.prototype.filter方法輕松地重寫該算法:

[1, 2, 3, 4, 51, 2, 3, 5].filter(function(c) {
    return [1, 2, 3].indexOf(c) < 0;
}); // [4, 51, 5]

您的問題是因為當您從數組中拼接一個成員時,它的長度較短,並且這些成員被降低了一個,因此您跳過了下一個成員。 簡單的解決方案是遍歷反向拼接的數組。

另外,您需要拼接j ,而不是childArr[j]

var arr = [1, 2, 3];

var childArr = [1, 2, 3, 4, 51, 2, 3, 5];

for (var i = 0; i < arr.length; i++) {
    for (var j = childArr.length; j >=0; j--) {
        if (childArr[j] === arr[i]) {
            childArr.splice(j, 1);
        }
    }
}

console.log(childArr); // [4, 51, 5]

還可以使用while循環:

for (var i = 0; i < arr.length; i++) {
    var j = childArr.length;
    while (j--) {
        if (childArr[j] === arr[i]) {
            childArr.splice(j, 1);
        }
    }
}

您有一個小錯字:

var arr = [1, 2, 3];
var childArr = [1, 1, 2, 3, 4, 51, 2, 3, 5];
for (var i = 0; i < arr.length; i++) {
   for (var j = 0; j < childArr.length; j++) {
       if (childArr[j] === arr[i]) {
           childArr.splice(j--, 1); // <-- pass index only.
       }
   }
}

這個怎么樣? 這有點冗長,但是它可以處理多次出現要刪除的值的情況。 它還不使用indexOf。

var arr = [1, 2, 3];

var childArr = [1, 2, 3, 4, 51, 2, 3, 5];


for (var i = 0; i < arr.length;) {
    var foundInChildIndex = null;
    for (var j = 0; j < childArr.length; j++) {
        if (childArr[j] === arr[i]) {
            foundInChildIndex = j;
            break;
        }
    }
    if (foundInChildIndex != null) {
        childArr.splice(foundInChildIndex, 1);
    } else {
        i++;
    }
}

暫無
暫無

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

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