【问题标题】:How to think of "forEach" instead of regular for loops?如何考虑“forEach”而不是常规的 for 循环?
【发布时间】:2015-08-01 23:00:19
【问题描述】:

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

为什么“cleanerSet”不能像“cleanSet”那样工作?

【问题讨论】:

  • stopper[j] 错误:stopper 的实际值是多少?可以使用 setWordstopper 作为它们的值来删除索引本身。
  • 您确定第一个版本可以正常工作吗?在这两个版本中,您都在修改原始数据结构。 . . .这不是一个好主意,可能会引入错误

标签: javascript arrays for-loop foreach


【解决方案1】:

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

theSet.splice(i,1);

【讨论】:

    【解决方案2】:

    我认为这就是你想要做的

    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]

    【讨论】:

    • 非常优雅的解决方案 - 然而,asker 说他是 JS 的新手,正在寻找他的代码为什么不起作用的解释。
    • 不喜欢仅代码的答案,尤其是当 OP 询问“为什么这不起作用”时。此外,OP 正在尝试了解 forEach 的工作原理,因此答案应显示如何在此特定场景中使用 forEach
    【解决方案3】:

    在传递给 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 2016-07-05
      • 2022-11-28
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多