2012-06-28 2 views
17

Извините, если это было задано раньше, но я не смог найти хороший пример того, что я пытаюсь выполнить. Возможно, я просто не искал правильных вещей. Пожалуйста, поправьте меня, если есть объяснение этого. Так или иначе ...Javascript json data grouping

Я данных JSON структурированы как так ...

{"Result":[ 
    {"Level":"ML","TeamName":"Team 1","League":"League 1"}, 
    {"Level":"ML","TeamName":"Team 2","League":"League 2"}, 
    {"Level":"ML","TeamName":"Team 3","League":"League 3"}, 
    {"Level":"3A","TeamName":"Team 4","League":"League 1"}, 
    {"Level":"3A","TeamName":"Team 5","League":"League 2"}, 
    {"Level":"3A","TeamName":"Team 6","League":"League 3"}, 
    {"Level":"2A","TeamName":"Team 7","League":"League 1"}, 
    {"Level":"2A","TeamName":"Team 8","League":"League 2"}, 
    {"Level":"2A","TeamName":"Team 9","League":"League 3"}, 
]} 

Я хотел бы группу, или реструктурировать его, как так ...

{"Result":[ 
    {"ML":[ 
     {"TeamName":"Team 1","League":"League 1"}, 
     {"TeamName":"Team 2","League":"League 2"}, 
     {"TeamName":"Team 3","League":"League 3"} 
    ]}, 
    {"3A":[ 
     {"TeamName":"Team 4","League":"League 1"}, 
     {"TeamName":"Team 5","League":"League 2"}, 
     {"TeamName":"Team 6","League":"League 3"} 
    ]}, 
    {"2A":[ 
     {"TeamName":"Team 7","League":"League 1"}, 
     {"TeamName":"Team 8","League":"League 2"}, 
     {"TeamName":"Team 9","League":"League 3"} 
    ]} 
]} 

Как бы я выполняю это с Javascript/jQuery? К сожалению, я не могу изменить то, что сервер отправляет мне.

+8

[? Что вы пробовали] (http://whathaveyoutried.com/) Это простая задача ... –

+0

Преобразовать JSON в объект, копировать соответствующие части на другой объект и преобразовать 2-й объект в json. Ты можешь это сделать. –

+0

@JonathanM Этот последний шаг может даже не понадобиться, поскольку, предположительно, они захотят фактически что-то сделать с объектом в какой-то момент. –

ответ

26

Просто следить за всем этим в объекте:

let groups = Object.create(null); 

data.forEach(item => { 
    if (!groups[item.Level]) { 
     groups[item.Level] = []; 
    } 

    groups[item.Level].push({ 
     TeamName: item.TeamName, 
     League: item.League 
    }); 
}); 

let result = 
    Object.entries(groups) 
     .map(([k, v]) => ({[k]: v})); 
+0

Может ли ваш цикл for (и следующая строка) быть упрощен в 'for (item in data)'? –

+2

@TimothyAaron: Нет, JavaScript 'for in' цикл выполняет итерации по клавишам, а не значениям, и вы не должны использовать его для перебора массивов. Итак, мы все еще ожидаем широкого применения 'для каждого': D – Ryan

+0

Он говорит, что использует jQuery, поэтому вы можете использовать $ .each. – Julian