如何思考" forEach"而不是常规的循环?

时间:2015-08-01 23:00:20

标签: javascript arrays for-loop foreach

我是JS的新手,我很难绕过" forEach"方法。

为了帮助说明,让我们说我有2个阵列。

第一个:包含字典中1000个随机单词的数组。 第二个:一个包含10"停用词的数组" (我希望过滤掉第一个数组的单词)。

如果我坐下来写一个带有这两个数组参数的函数,我的直觉会告诉我这样编码:

    function cleanSet(theSet, stoppers){
        for(var i=0;i<theSet.length;i++){
            for(var j=0; j<stoppers.length;j++){
                if(theSet[i] === stoppers[j]){
                    theSet.splice(i,1);
                }
            }
        }
        return theSet;
    }

但是,当我在编写此程序时尝试使用forEach时,它不起作用:

function cleanerSet(theSet, stoppers){
    theSet.forEach(function(setWord,i){
        stoppers.forEach(function(stopper, j){
            if(theSet[i] === stopper[j]){
                theSet.splice(i,1);
            }
        });
    });
    return theSet;
}

为什么没有&#34;#34; cleanSet&#34;工作方式&#34; cleanSet&#34;是

3 个答案:

答案 0 :(得分:3)

我认为这就是你想要做的事情

function cleanerSet(theSet, stoppers){
    return theSet.filter(function(setWord,i){
        return stoppers.indexOf(setWord) === -1;
    });
}

运行时: cleanerSet([1,2,3,4,5], [2,4]) // [1, 3, 5]

答案 1 :(得分:3)

问题是splice会改变你的数组,所以你必须记住,如果你从当前正在迭代的数组中删除一个项目,你的索引就不会被重置。至于如何解决它,@ Gyandeep提供了一个很好的解决方案。此外,在您的第一次实施中,我认为您可能意味着:

theSet.splice(i,1);

答案 2 :(得分:1)

在传递给foreach函数的回调中,当前迭代的值存储在函数的第一个参数中,当前索引存储在第二个参数中。因此,当您检查相等性时,您不需要引用索引;只需使用参数(即setWord或塞子)。

此外,当您调用splice时,第二个参数应该是您要删除的项目数,因此您需要传递1,而不是'i'。

此修改后的功能应该有效:

function cleanerSet(theSet, stoppers){
    theSet.forEach(function(setWord, i){
        stoppers.forEach(function(stopper){
            if(setWord === stopper){
                theSet.splice(i,1);
            }
        });
    });
    return theSet;
}