我有以下方法:
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/