Javascript 在多个对象上使用lodash mergeWith-是否可以检查父项?
我有一个成批调用API的进程。因此,我收到了多个回复。我想将所有这些响应连接到一个响应中 例如,这是一个响应的输出:Javascript 在多个对象上使用lodash mergeWith-是否可以检查父项?,javascript,node.js,lodash,Javascript,Node.js,Lodash,我有一个成批调用API的进程。因此,我收到了多个回复。我想将所有这些响应连接到一个响应中 例如,这是一个响应的输出: { "updateFromMyAPI": { "address": { "success": [ "ID_321bcd", // List of successful IDs "ID
{
"updateFromMyAPI": {
"address": {
"success": [
"ID_321bcd", // List of successful IDs
"ID_765jgf"
],
"failure": [
{
"id": "ID_778ttw",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_344tyf",
"error": {
"someField1": "",
"someField2": []
}
}
]
},
"phone": {
"success": [
"ID_123acd", // List of successful IDs
"ID_444bva"
],
"failure": [
{
"id": "ID_789xyz",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_111taf",
"error": {
"someField1": "",
"someField2": []
}
}
]
}
},
"processedFromMyAPI": { "success": 500, "failure": 100 }
}
这是第二个输出:
{
"updateFromMyAPI": {
"address": {
"success": [
"ID_001abc"
],
"failure": []
},
"phone": {
"success": [
"ID_888ttv"
],
"failure": [
{
"id": "ID_007ttr",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_008iit",
"error": {
"someField1": "",
"someField2": []
}
}
]
}
},
"processedFromMyAPI": { "success": 200, "failure": 50 }
}
我想将它们组合起来,这样我就有一个输出文件,如下所示:
{
"updateFromMyAPI": {
"address": {
"success": [
"ID_321bcd",
"ID_765jgf",
"ID_001abc"
],
"failure": [
{
"id": "ID_778ttw",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_344tyf",
"error": {
"someField1": "",
"someField2": []
}
}
]
},
"phone": {
"success": [
"ID_123acd",
"ID_444bva",
"ID_888ttv"
],
"failure": [
{
"id": "ID_789xyz",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_111taf",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_007ttr",
"error": {
"someField1": "",
"someField2": []
}
},
{
"id": "ID_008iit",
"error": {
"someField1": "",
"someField2": []
}
}
]
}
},
"processedFromMyAPI": { "success": 700, "failure": 150 }
}
我相信我已经正确地使用lodash
mergeWith
和以下代码来连接数组:
let output = {};
_.mergeWith(output, ...apiResponses, function (objValue, srcValue, key, object, source, stack) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
});
这很好,但是没有将processedFromMyAPI
对象中的值添加到一起。在最后的连接输出中,我得到的不是“processedFromMyAPI”:{“success”:700,“failure”:150}
,而是“processedFromMyAPI”:{“success”:200,“failure”:50}
。这是因为200
和50
的值来自要连接的最后一个输出。因此,它不是分别将数字500+200和100+50相加,而是用最后一个输出覆盖该值
我可以添加一个额外的if语句来检查键
,如果键是成功
或失败
,则将它们相加
let output = {};
_.mergeWith(output, ...apiResponses, function (objValue, srcValue, key, object, source, stack) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
} else if(key === "success" || key === "failure"){
return (objValue != null) ? objValue + srcValue : srcValue;
}
});
这很有效。现在我得到的是“processedFromMyAPI”:{“success”:700,“failure”:150}
而不是“processedFromMyAPI”的最后一个串联响应:{“success”:200,“failure”:50}
。但是,我不喜欢它的工作方式,因为它太宽泛了,当我希望它查找MyAPI.success中的processedFromAPI.success和processedFromAPI.failure时,它只查找success
或failure
。我很想知道是否有办法做到这一点
我注意到有一个对象
参数。当我输出它时,它显示
{ success: 200, failure: 50}
更新代码:
let output = {};
_.mergeWith(output, ...apiResponses, function (objValue, srcValue, key, object, source, stack) {
if(key === "success" || key === "failure"){
console.log("object: ");
console.log(object);
}
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
} else if(key === "success" || key === "failure"){
return (objValue != null) ? objValue + srcValue : srcValue;
}
});
这更接近我想要的,但我需要的是:
if((key === "success" || key === "failure") && object.parent.key === "processedFromMyAPI"){
return (objValue != null) ? objValue + srcValue : srcValue;
}
长话短说,如果成功/失败值来自“processedFromMyAPI”对象,我只想将它们添加在一起。我怎样才能做到这一点