javascript - 两个嵌套的 async.each 调用

标签 javascript asynchronous async.js

我有以下方法:

mergeAinBbyAttr: function(a, b, attr1, attr2, val, cb) {
    var result = [];
    async.each(a, function(itemA, cb1) {
        async.each(b, function(itemB, cb2) {
            if (itemA[attr1] == itemB[attr1]) {
              itemB[attr2] = val;
            }
            result.push(itemB);
            cb2(null, result);
          },
          function(e, result) {
            sails.log('[result]', result);
            cb1(e, result);
          });
      },
      function(e, result) {
        cb(e, result);
      });
  }

我基本上想将一个对象数组 (A) 与另一个对象数组 (B) 进行比较,并返回包含 B 中每个项目的更新数组 (C),但使用 A 中的属性进行更新。

上述[结果]返回未定义。

谢谢

最佳答案

首先,这都是同步代码,因此您不需要异步模块,只需要常规循环构造。但我们假设您需要异步。

为了更简洁,使用async.map而不是async.each:

mergeAinBbyAttr: function(a, b, attr1, attr2, val, cb) {

    async.map(a, function(itemA, cb) {
        async.map(b, function(itemB, cb) {
            if (itemA[attr1] === itemB[attr1]) {
              itemB[attr2] = val;
            }
            cb(null, itemB);

          },cb);

      },cb);
  }

您不需要将 cb 变量命名为不同的名称,因为它们具有不同的作用域。

如果您想在此例程结束时使用扁平数组,我建议使用 lodash 或 underscore 中的 _.flatten_.flattenDeep

请注意:

function(e, result) {
   cb(e, result);
});

可以简化为:

cb

====================================

使用同步方法执行此操作:

    mergeByAttr: function(a, b, attr1, attr2, val) {

      return a.map(function(itemA){
          return b.map(function(itemB){
                if (itemA[attr1] === itemB[attr1]) {
                  itemB[attr2] = val;
                }
                return itemB;
           });

      });
   }

正如您所看到的,无论哪种方式,您都会得到嵌套数组,它与异步模块无关,而是代码的性质。

性能更高但功能更少的方式:

     mergeByAttr: function(a, b, attr1, attr2, val) {

          a.forEach(function(itemA){
              b.forEach(function(itemB){
                    if (itemA[attr1] === itemB[attr1]) {
                      itemB[attr2] = val;
                    }
                    return itemB;
               });

          });
       }

关于javascript - 两个嵌套的 async.each 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43286374/

相关文章:

node.js - Step.js 和使用 CoffeeScript 的异步控制流

java - 如何处理 CompletableFuture 链中的错误响应?

javascript - 无法访问vue js中的props数据?

javascript - JS中如何抽象出一个函数作为参数?

javascript - angular2 中的老虎机旋转效果

jquery - YUI JavaScript 代码中以下代码保护有什么用?

javascript - 生成动态画廊jquery

javascript - 错误: SQLITE_ERROR: no such column: undefined

c++ - gRPC:在 C++ 中关闭异步服务器的推荐方法是什么?

javascript - Node.JS async.parallel 混淆 | async.map 返回什么