[英]Two nested async.each calls
我有以下方法:
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或下划线中的_.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;
});
});
}
如您所见,无论哪种方式,您都将获得嵌套数组,它与async模块无关,但与代码的性质无关。
性能更高但功能较少的方式:
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;
});
});
}
好吧,我看着上面的答案对您有所帮助,只有我想强调一下有关您的错误的一件事:
[结果]返回未定义。
因为根据文档,可选函数只有1个参数,而您试图获取2个参数:function(e,result)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.