【问题标题】:javascript JSON : Sum two or more json having only numeric values with same keysjavascript JSON:将两个或多个仅具有相同键的数值的json相加
【发布时间】:2018-10-05 06:29:12
【问题描述】:

我是 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 中使用更优化的方法

【问题讨论】:

  • 请包括尝试的脚本和预期的输出
  • 我已经添加了预期的结果。我还没有尝试任何脚本,因为除了使用循环之外我无法获得任何其他想法。我不想使用循环,因为我要添加 100 个这样的元素。
  • 我会使用循环。我也会尝试解决这个问题,你会得到答案的。
  • 我推荐递归。考虑处理函数中的所有标量成员并将对象成员处理为对同一函数的可重入调用。我不能用我的智能手机轻松地打字。希望这个提示会帮助你
  • 仅供参考,这是两个 javascript 对象,而不是 JSON

标签: javascript json node.js typescript


【解决方案1】:

我整理了一个 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 对象以生成所需的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2018-02-23
    相关资源
    最近更新 更多