[英]javascript JSON : Sum two or more json having only numeric values with same keys
我是Nodejs和Typescript的新手,下面有两个json:
json1 =
{
"201809": 2,
"metric": "headcount",
"quarter1": 60,
"careerLevelsGroups": [{
"201809": 2,
"quarter1": 60,
"careerLevels": [{
"201809": 2,
"careerId": "careerId1",
"quarter1": 60,
},
{
"201809": 2,
"careerId": "careerId2",
"quarter1": 50,
}
]
}]
}
json2 =
{
"201809": 3,
"metric": "headcount",
"quarter1": 100,
"careerLevelsGroups": [{
"201809": 7,
"quarter1": 40,
"careerLevels": [{
"201809": 9,
"careerId": "careerId1",
"quarter1": 30,
},
{
"201809": 8,
"careerId": "careerId2",
"quarter1": 30,
}
]
}]
}
我想对与相同键关联的所有数值求和,并产生一个具有json1和json2的总和的json。
result =
{
"201809": 5,
"metric": "headcount",
"quarter1": 160,
"careerLevelsGroups": [{
"201809": 9,
"quarter1": 100,
"careerLevels": [{
"201809": 11,
"careerId": "careerId1",
"quarter1": 90,
},
{
"201809": 10,
"careerId": "careerId2",
"quarter1": 80,
}
]
}]
}
我正在尝试使用循环,但是我有太多这样的元素需要总结,所以请您提出一个建议在Node.js中使用的更优化的方法
我整理了一个combine()
函数,该函数使用递归来处理JSON对象的成员。 如果检测到"number"
则将其合并。 如果检测到"object"
则应用递归在其中搜索更多"number"
或"object"
。 对于任何其他类型(例如"string"
),它仅保留值。
function combine(acc, curr) { for (var key in acc) { switch (typeof(acc[key])) { case "number": acc[key] += curr[key]; break; case "object": combine(acc[key], curr[key]); break; } } } var json1 = { "201809": 2, "metric": "headcount", "quarter1": 60, "careerLevelsGroups": [{ "201809": 2, "quarter1": 60, "careerLevels": [{ "201809": 2, "careerId": "careerId1", "quarter1": 60, }, { "201809": 2, "careerId": "careerId2", "quarter1": 50, } ] }] }; var json2 = { "201809": 3, "metric": "headcount", "quarter1": 100, "careerLevelsGroups": [{ "201809": 7, "quarter1": 40, "careerLevels": [{ "201809": 9, "careerId": "careerId1", "quarter1": 30, }, { "201809": 8, "careerId": "careerId2", "quarter1": 30, } ] }] }; var res = json1; combine(res, json2); console.log(JSON.stringify(json1, undefined, 2));
运行脚本会产生所需的输出。 遍历一系列这些JSON对象以生成所需结果应该是一个简单的执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.