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

问题描述 投票:2回答:3

我试图用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 = []
javascript
3个回答
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 = []

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);

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.