javascript - 如何补偿仍在进行中的数组迭代中已删除的元素?

标签 javascript arrays loops

<分区>

我正在使用 forEach() 遍历字符串数组,并测试每个元素的长度以确定它是偶数还是奇数。如果字符串的长度是偶数,则使用 splice() 将其删除。

我的输入和输出如下所示,正如您所看到的,即使(我认为)我的条件是正确的,在我的返回数组中,我仍然得到一个偶数,两个字符的单词——它应该被拼接出来。

代码:


function filterOddLengthWords(words) {
    words.forEach(function(element, index) {
        if (element.length%2===0) {
            words.splice(index, 1);
        }
    })
    return words;
}

var output = filterOddLengthWords(['there', 'it', 'is', 'now']);
console.log(output); // --> [ 'there', 'is', 'now' ]

我知道错误在哪里,但我不知道如何弥补。我可以通过在函数开头创建一个空数组来重写它,然后根据相反的条件测试每个元素,使用 push() 方法将每个正数添加到空数组中。但是,这效率更低,我很想知道我的方法是否可行。提前感谢您的回答。

最佳答案

通过拼接一个数组,你改变了索引,但是forEach提前取了元素和旧的索引。

通常通过使用splice,迭代从末尾开始,如果某个项目被移除,则索引保留之前的项目。


您可以过滤数组。

function filterOddLengthWords(words) {
    return words.filter(function(element) {
        return element.length % 2;
    });
}

var output = filterOddLengthWords(['there', 'it', 'is', 'now']);

console.log(output);

关于javascript - 如何补偿仍在进行中的数组迭代中已删除的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921672/

相关文章:

javascript - Liquid Layout, JS 解决方案

exception - Grails中的ArrayList和Map问题

javascript - Mongo shell javascript 数组扩展

javascript - AngularJS 广播

javascript - 我如何检查输入是否不存在

javascript - 为什么 Flux 中的单例 Store 会导致服务器端渲染出现问题

javascript - 如何选择数组的前三个元素并构造一个逗号分隔的字符串

python - while 循环覆盖结果

python - 从列表中选择的最佳方式

php - Loop 没有使用完整的 IP 而只使用第一个数字