首页 > 解决方案 > 带有嵌套 .forEach() 的循环会产生 no-loop-func es-lint 警告

问题描述

这是一个javascript问题。不久前,我在 Ruby 教程中学习了一种排序模式,现在我试图在 javascript 中重用相同的模式:

const sortMyArray = (someArr) => {

let arrToSort = [...someArr];

let sorted = false;

  while(!sorted) {
   sorted = true;

    array1.forEach((foo) => {

      array2.forEach((bar, i) => {

        if (foo.attr !== bar.attr) {

          let plucked = arrayToSort.splice(i, 1)
          arrayToSort.push(plucked[0])
          sorted = false
        }
      })
    })
  }

}

我对这种模式感到满意,并希望保留它。我必须将 es-lint 配置no-loop-func为在文件顶部忽略(有问题的sorted变量是从内部循环外部传递的变量),但我想避免使用 javascript 执行此操作,因为警告很有用,我只是认为它对这个例子没有帮助。

有没有其他方法可以实现在 javascript 中运行良好的相同类型?

标签: javascripteslint

解决方案


https://eslint.org/docs/rules/no-loop-func

警告应该更具体地说明它与sorted变量有关:

在循环中声明的函数包含对“已排序”变量的不安全引用。(无循环功能)

这里不喜欢的是循环内部有一个函数可以修改sorted外部的 —— 它不知道这个函数保证在你的 while 循环中只运行一次。

无论如何,您可以通过以下方式解决此问题:

for (const foo of array1) {

或者如果您需要索引(例如第二个循环):

for (let i = 0; i < array2.length; i++) {
    const bar = array2[i];

现在您不再在使用外部变量的循环内创建函数。


推荐阅读