[英]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.