在环绕它时从javascript数组中删除项目

时间:2014-05-09 13:45:09

标签: javascript arrays

我有两个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);
        }
    }
}

4 个答案:

答案 0 :(得分:4)

您正在尝试创建“数组差异”算法的实现,可以使用Array.prototype.filter方法轻松重写:

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

答案 1 :(得分:0)

您的问题是因为当您从阵列中拼接成员时,它的长度会缩短,成员会被移动一个,所以您跳过下一个成员。简单的解决方案是迭代拼接反向的数组。

此外,您需要拼接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);
        }
    }
}

答案 2 :(得分:0)

你有一个小错字:

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.
       }
   }
}

答案 3 :(得分:0)

这个怎么样?它有点冗长,但它处理了多次出现要删除的值的情况。它也没有使用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++;
    }
}