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