javascript - 带有嵌套 .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 中运行良好的相同类型?
解决方案
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];
现在您不再在使用外部变量的循环内创建函数。
推荐阅读
- c++ - 除了锁和线程的创建和销毁成本之外,什么会降低多线程的性能?
- asp.net-core - 创建新项目时缺少asp.net core 3.1 accountcontroller
- c# - 如何在 C# 中使用表情符号构建 unicode 字符串?
- codeblocks - 如何为 WinBGIm 安装此修复程序?
- c# - 如何将 uint[] c# 传递给 c++ dll?
- angular - Angular 以编程方式将服务注入函数
- docker - docker-compose 报错无效类型,应该是字符串
- linux - 为什么终端和 bash 脚本的结果不同?
- javascript - 如何在 Firebase 身份验证中检查是否从 Google 重定向?
- mongodb - mongo 将单个对象转换为一个元素数组