我是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;是
答案 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;
}