JavaScript JSON: сумма двух или более JSON, имеющих только числовые значения с одинаковыми ключами - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в Nodejs и машинописи. У меня ниже двух jsons:

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,
                }
            ]
        }]
    }

Я хочу суммировать все числовые значения, связанные с одними и теми же ключами, и получить один json, имеющий суммированные значения json1 и json2.

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

1 Ответ

0 голосов
/ 26 апреля 2018

Я собрал функцию 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 для получения требуемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...