我有以下方法:
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中的属性进行更新。
上述[result]返回undefined。
由于
答案 0 :(得分:1)
首先,这是所有同步代码,因此您不需要异步模块,只需要定期循环结构。但我们假设您需要异步。
使用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 :(得分:0)
嗯,我看到上面的答案对你有帮助,只有我想强调一下你的错误:
[result]返回undefined。
是因为根据文档,可选函数只有1个参数,并且你试图得到2个参数:function(e,result)