【发布时间】:2020-04-02 15:33:56
【问题描述】:
所以,我得到了以下代码,但我希望它不再使用 for 循环。
重要的是“打破”故事。
for (const obj of objects) {
let found = false;
for (const item of items) {
const result = item.get(obj);
if (typeof result !== 'undefined') {
found = true;
break;
}
}
if (!found) {
notDefined.push(obj);
}
}
我已经用 Bluebird 尝试过,但我失败了。 Array.prototype.forEach 不是一个选项,它无法停止。
我还能尝试什么?
编辑:重点是填充对象列表,即“未定义”对象。该列表表示地图中未找到的项目,这些项目已被有意填充。
所以他们中的一堆被测试匹配。
如果项目确实被找到,我们应该跳到下一组。当然:停止循环遍历这些项目,因为我们找到了匹配项,因此继续没有意义。不需要一直检查所有剩余的项目,可能有几十万。
EDIT2:“未定义”列表的目的是将对象写入文本文件,以后可以手动检查。
变量名称已与原来的不同,这里有一些不同的东西。
代码的目的是将一台机器上多个目录的内容与另一台机器上多个目录的内容进行比较。
这些数据以多个 CSV 文件的形式出现。它们都被读取并为每个 CSV 文件生成一个列表。此 CSV 文件中的数据为:
- 绝对文件路径
- 文件大小
- Md5
还有其他一些元数据。
但是,这个列表每次都不仅仅包含绝对文件路径的字符串,它还包含一个Map(),键是上面提到的3条数据的组合。
所以我们有几个用于机器 A 的 CSV 文件,然后有几个用于机器 B 的 CSV。我们希望看看在机器 A 上找到的项目是否也可以在机器 B 上找到。
这就是我在这里尝试做的事情:遍历所有 CSV 并找到匹配的项目。
如果我找到匹配项,则没有必要继续检查,我可以跳到下一组。这就是break; 的来源。
但我确实需要检查每一个匹配项,然后为在任何地方找不到的所有项目写一个结果。
【问题讨论】:
-
不想“不再使用循环”,您实际上需要做什么?因为使用了 Promise(这不太可能不再需要 bluebird,当浏览器和节点本身不支持它们时,这是一个有意义的库)。您显示的代码非常好奇,因为它似乎并不关心它发现了什么,只是“某些属性”在“任何对象”中,没有进一步解释感觉几乎没用:你能具体描述一下你是什么吗尝试这样做,因为可能有一种您没有考虑过的非常简单的方法。
-
这里的异步代码在哪里?
-
@Mike'Pomax'Kamermans 添加了更多解释。
-
@VLAZ async/await 是一种可能的解决方案。它还没有,我也不记得曾经写过。
-
我不是在谈论关键字
await——这段代码的哪一部分是异步的?你提到你用 Bluebird 尝试过,但你用 Bluebird 试过 what?这段代码的哪一部分需要异步处理?
标签: javascript node.js performance loops