Манипуляции с объектами

Я использую PHP или Javascript для управления объектом json из образца API:

{
"data": [
    {
        "label": "employeeCount",
        "stats": [
            {
                "year": "2015",
                "value": "10"
            },
            {
                "year": "2017",
                "value": "30"
            },
            {
                "year": "2016",
                "value": "50"
            }
        ]
    },
    {
        "label": "managerCount",
        "stats": [
            {
                "year": "2015",
                "value": "2"
            },
            {
                "year": "2017",
                "value": "4"
            },
            {
                "year": "2016",
                "value": "6"
            }
        ]
    }
  ]
}

Мне нужно классифицировать его по годам как объект вроде такого:

"record": {
  "2015" : {
    "employeeCount": "10",
    "managerCount": "2"
  },
  "2016" : {
    "employeeCount": "30",
    "managerCount": "4"
  },
  "2017"{
    "employeeCount": "50",
    "managerCount": "6"
  }
}

Количество year и количество label будут отличаться от вызова API, поэтому я думаю об использовании цикла for, чтобы это произошло. Но пока безуспешно. Какой подход вы бы использовали для такого рода манипуляций?

Как насчет десериализации объекта json, манипулирования им и повторного преобразования в строку json.

jeevjyot singh chhabda 17.09.2018 18:19

«Но пока безуспешно», что вы пробовали?

Jared Smith 17.09.2018 18:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
2
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте Array.forEach

ЛОГИКА - Идея состоит в том, чтобы перебрать data array в объекте, а затем для каждой записи в массиве данных перебрать соответствующий stats array, чтобы заполнить объект на основе year. При повторении stat arrayпроверить существующую запись в результирующем объекте. Если не существует, создайте для него запись. Обновите запись, добавив label как ключ и value из соответствующего объекта в stat array.

let obj = {"data":[{"label":"employeeCount","stats":[{"year":"2015","value":"10"},{"year":"2017","value":"30"},{"year":"2016","value":"50"}]},{"label":"managerCount","stats":[{"year":"2015","value":"2"},{"year":"2017","value":"4"},{"year":"2016","value":"6"}]}]};

// Create the response object
let r = {"record":{}};
// Iterate over data array
obj.data.forEach(o => {
  // Iterate over stats for each object in data array
  o.stats.forEach(s => {
    // Create entry for year in result object if it does not exist
    r.record[s.year] = r.record[s.year] || {};
    // Add the label of data array object with corresponding stat value in resultant object
    r.record[s.year][o.label] = s.value;
  });
});
console.info(r);

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. В хороший ответ всегда будет объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO.

Jay Blanchard 17.09.2018 19:45

@JayBlanchard - Точка взята. Обновленный ответ

Nikhil Aggarwal 17.09.2018 20:00
let data = json.data
let map = {}
for(let i=0;i<data.length;i++){
    let stats = data[i].stats
    for(let j=0;j<stats.length;j++){
        let it = stats[j]
        if (!map[it.year]){
            map[it.year] = {}
        }
        map[it.year][data[i].label]=it.value
    }
}
console.info({record:map})

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. В хороший ответ всегда будет объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO.

Jay Blanchard 17.09.2018 19:45

Другие вопросы по теме