JavaScript JSON : Sum two or more json having only numeric values with same keys

标签 javascript json node.js typescript

我是 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 对象以生成所需的结果。

关于JavaScript JSON : Sum two or more json having only numeric values with same keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011087/

相关文章:

JavaScript 计时器不会重置

javascript - Node 流 - 超出最大调用堆栈

javascript - 在每条语句中传入 For 循环参数

sql - postgreSQL 查询 jsonb 列中的空数组字段

c++ - 如何在 MacOS 上的 NodeJS native 插件上创建 OpenGL 上下文?

node.js - 使用 sinon 和 mocha 测试 node.js http.get

javascript - VueJS : Deleting dinamically rendered component in array with splice() method based on provided index, 不起作用

javascript - 向两个不同方向切换菜单

javascript - JSON 使用 JavaScript 读取本地文件(类似的问题 Stack Overflow 没有帮助)

javascript - npm 错误!过早关闭