Javascript 如何考虑“forEach”而不是常规for循环?

Javascript 如何考虑“forEach”而不是常规for循环?,javascript,arrays,for-loop,foreach,Javascript,Arrays,For Loop,Foreach,我是JS新手,在理解forEach方法时遇到了麻烦 为了帮助说明,假设我有两个数组 第一个:包含字典中1000个随机单词的数组。 第二个:一个包含10个stopwords的数组,我想从第一个数组中筛选出来 如果我坐下来写一个接受这两个数组参数的函数,我的直觉会告诉我这样编码: function cleanSet(theSet, stoppers){ for(var i=0;i<theSet.length;i++){ for(var j=0;

我是JS新手,在理解forEach方法时遇到了麻烦

为了帮助说明,假设我有两个数组

第一个:包含字典中1000个随机单词的数组。 第二个:一个包含10个stopwords的数组,我想从第一个数组中筛选出来

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

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

为什么cleanerSet不能像Cleanest那样工作?

我想这就是你想要做的

function cleanerSet(theSet, stoppers){
    return theSet.filter(function(setWord,i){
        return stoppers.indexOf(setWord) === -1;
    });
}
运行时:
清洁集[1,2,3,4,5],[2,4]/[1,3,5]

我想这就是你想要做的

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]

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

此外,调用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;
}

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

此外,调用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;
}

问题是拼接会使数组发生变异,因此必须记住,如果从当前迭代的数组中删除一个项,则不会重置索引。至于如何解决这个问题,@Gyandeep提供了一个很好的解决方案。另外,在您的第一个实现中,我认为您的意思可能是:

theSet.splice(i,1);

问题是拼接会使数组发生变异,因此必须记住,如果从当前迭代的数组中删除一个项,则不会重置索引。至于如何解决这个问题,@Gyandeep提供了一个很好的解决方案。另外,在您的第一个实现中,我认为您的意思可能是:

theSet.splice(i,1);

塞子[j]错误:塞子的实际值是多少?可以使用setWord和stopper作为值删除索引本身。您确定第一个版本正确吗?在这两个版本中,您都在中途修改原始数据结构。这不是一个好主意,可能会引入bugsstopper[j]是错误的:实际的塞子值是多少?可以使用setWord和stopper作为值删除索引本身。您确定第一个版本正确吗?在这两个版本中,您都在中途修改原始数据结构。这不是一个好主意,可能会引入bugsVery优雅的解决方案——不过asker说他是JS的新手,正在寻找代码不起作用的解释。代码——只有答案不受欢迎,特别是当OP问为什么这不起作用时。此外,OP正在试图了解forEach是如何工作的,因此答案应该显示如何在这个特定场景中使用forEach。非常优雅的解决方案-但是asker说他是JS的新手,正在寻找解释为什么他的代码不工作。代码-只有答案不受欢迎,特别是当OP问为什么这不工作时。此外,OP试图了解forEach是如何工作的,因此答案应该显示如何在这个特定场景中使用forEach。