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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте 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.
@JayBlanchard - Точка взята. Обновленный ответ
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.
Как насчет десериализации объекта json, манипулирования им и повторного преобразования в строку json.