Nodejs与async/bluebird脱离循环



因此,我有以下代码可以工作,但我希望它不再使用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);
}
}

我在蓝鸟上试过,但我在那里失败了。Array.prototype.forEach不是一个选项,它无法停止。

我还能尝试什么?

编辑:重点是填充对象列表,即"未定义"对象。该列表表示在经过有意填充的地图中找不到的项目。

因此,他们中的一批人要接受一场比赛的测试。

如果找到项目,我们应该跳到下一组。当然:停止在项目上循环,因为我们已经找到了匹配项,所以没有必要继续。不需要不断检查所有剩余的项目,这些项目很可能有几十万。

EDIT2:"未定义"列表的目的是将对象写入文本文件,以后可以手动检查。

变量名称已从原来的名称更改为不同的名称。

该代码的目的是将一台机器上几个目录的内容与另一台计算机上几个目录上的内容进行比较。

这些数据以几个CSV文件的形式出现。它们都被读取,并且每个CSV文件都会生成一个列表。此CSV文件中的数据为:

  • 绝对文件路径
  • 文件大小
  • Md5

以及其他一些元数据。

然而,该列表每次不仅仅包含绝对文件路径的字符串,它还包含一个Map(),该密钥是上面提到的3条数据的组合。

因此,我们有机器A的几个CSV文件,然后有机器B的几个CSV。我们希望看看在机器A上找到的项目是否也可以在机器B上找到。

这就是我在这里要做的:遍历所有CSV并找到匹配的项目。

如果我找到了匹配项,那么就没有必要继续检查了,我可以跳到下一盘。这就是break;的来源。

但我确实需要检查每一个匹配,然后为所有找不到的项目写一个结果。

在我看来,您有两个数组,objectsitems

而且,在我看来,你想要一种性能良好的方法来知道所有地图中的每个对象是否都丢失了。我想你对打破for循环的兴趣是你策略的一部分,目的是让它表现得得体。

我可以建议另一种方法吗?让我们从制作所有Map对象中所有关键点的单个集合开始。像这样的东西。

const allKeys = new Set()
for (const item of items)
for (const key of item.keys())
allKeys.add(key)

现在,您逐个运行对象数组,如果allKeys集合中没有对象,则将它们推入notDefined

for (const obj of objects)
if (!allKeys.has(obj)) 
notDefined.push(obj)

这可以让您摆脱两个数组上的嵌套迭代。它的性能很好,因为Set查找很快。

所有这些,在一些完全同步的紧密循环中(不需要承诺(:

const allKeys = new Set()
for (const item of items)
for (const key of item.keys())
allKeys.add(key)
for (const obj of objects)
if (!allKeys.has(obj))
notDefined.push(obj)

为了更快,您可以考虑在从CSV文件中读取原始数据时构建allKeys集。这将节省对items的所有元素的传递。

最新更新