为什么foreach从数组中跳过一个元素

时间:2018-03-04 16:27:05

标签: javascript

我正在尝试使用forEach迭代一个数组,并根据条件,我做了一些事情。

对于这个问题,我简化了条件,试图了解正在发生的事情。

我希望在操作之后使用数组b = [],但它不是,因为它只在元素上运行一半。为什么会这样?

(这不是要删除b中的所有内容,只是试图理解为什么它会跳过偶数索引。



var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

console.log('before b = ', b); // b = [1, 2, 3, 4, 5, 6]

a.forEach(function (e) {
    if (e > 0) {
        b.splice(a.indexOf(e), 1);
    }
});


console.log('after b = ', b); // b = [2, 4, 6]

// but I expect b = []




3 个答案:

答案 0 :(得分:3)

没有。它遍历每一个项目。这就是你用数组b做的事情。 首先从它中删除索引0,即1.现在b = [2,3,4,5,6]。 然后索引1为3 b = [2,4,5,6]。 然后索引2为5 b = [2,4,6]。 最后的索引不存在,所以最后b = [2,4,6]

要使预期结果在您的拼接调用中使用b.indexOf(e)

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

console.log('before b = ', b); // b = [1, 2, 3, 4, 5, 6]

a.forEach(function (e) {
    if (e > 0) {
        b.splice(b.indexOf(e), 1);
    }
});


console.log('after b = ', b); // b = [2, 4, 6]

// but I expect b = []

答案 1 :(得分:2)

您可以直接获取索引进行拼接,并从数组的值中生成日志。你可以看,数组变得小于拼接索引。

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

console.log(b.join(' '));

a.forEach(function (e, i) {
    if (e > 0) {
        b.splice(a.indexOf(e), 1);
        console.log(i, ': ', b.join(' '));
    }
});

console.log(b); // b = [2, 4, 6]

要清空b,您需要查找数组b的索引,而不是a并拼接它。

var a = [1, 2, 3, 4, 5, 6];
var b = a.slice(0);

a.forEach(function (e, i) {
    if (e > 0) {
        b.splice(b.indexOf(e), 1);
        //       ^
    }
});

console.log(b);

答案 2 :(得分:1)

您根据a中元素的索引进行拼接,但是当您拼接时,b的索引会更新。您应该尝试根据元素IN b的索引从b拼接。