Я использую 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, чтобы это произошло. Но пока безуспешно. Какой подход вы бы использовали для такого рода манипуляций?

-4
Ming Huang 17 Сен 2018 в 19:14

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.log(r);
4
Nikhil Aggarwal 17 Сен 2018 в 18: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.log({record:map})
0
Laziji 17 Сен 2018 в 16:29