2012-06-28 11 views
17

Scusate se è stato chiesto in precedenza, ma non sono riuscito a trovare un buon esempio di ciò che sto cercando di realizzare. Forse non sto cercando la cosa giusta. Per favore correggimi se c'è una spiegazione di questo da qualche parte. Comunque ...Javascript json grouping

ho dati JSON strutturati in questo modo ...

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

Vorrei gruppo, o ristrutturare in questa maniera ...

{"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"} 
    ]} 
]} 

Come vorrei realizzare questo con Javascript/jQuery? Purtroppo non posso modificare ciò che il server mi sta inviando.

+8

[? Che cosa hai provato] (http://whathaveyoutried.com/) Questo è un problema banale ... –

+0

Convertire il JSON per un oggetto, copia parti rilevanti in un altro oggetto e converti 2 ° oggetto in json. Puoi farlo. –

+0

@JonathanM L'ultimo passaggio potrebbe non essere nemmeno necessario, dal momento che presumibilmente vorranno effettivamente fare qualcosa con l'oggetto ad un certo punto. –

risposta

26

Basta tenere traccia di tutto questo in un oggetto:

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

Il ciclo for (e la riga successiva) possono essere semplificati in 'for (item in data)'? –

+2

@TimothyAaron: No, il ciclo 'for in' di JavaScript esegue iterazioni su chiavi, non valori, e non dovresti usarlo per iterare su array. Quindi, stiamo ancora aspettando un'adozione diffusa di "per ciascuno": D – Ryan

+0

Dice che sta usando jQuery, quindi potresti usare $ .each. – Julian