2013-03-19 15 views
5

Sto provando a convertire una stringa JSON in un oggetto letterale Javascript. Penso che sia possibile con alcuni loop, ma non ho potuto farlo. La struttura di destinazione è mostrata sotto, "chartData".Convertire una struttura di dati ad oggetti nidificati javascript in matrici annidate

Fiddle può essere trovato qui: http://jsbin.com/ajemih/13/edit

Ecco i dati JSON:

{ 
    "1b":{ 
     "allLoad":"130", 
     "loadMovement":"111", 
     "allMovement":"111" 
    }, 
    "1a":{ 
     "allLoad":"910", 
     "loadMovement":"671", 
     "allMovement":"280" 
    }, 
    "systemLoad":"963" 
} 

Questo dovrebbe assomigliare dopo la conversione:

chartData = [[['loadMovement', 111], 
       ['allMovement', 120], 
       ['allLoad', 130]], 
      [['Load+Move', 671], 
       ['allMovement', 280], 
       ['allLoad', 910]]]; 
+2

Il testo della tua domanda non ha senso. Non c'è una stringa JSON in nessuno dei tuoi blocchi di codice. Stai solo chiedendo come convertire la prima struttura dati javascript nella seconda struttura dati? – jfriend00

+0

Sì. Voglio convertire la prima struttura dati nella seconda. – mcknight

+1

@ jfriend00 il suo primo segmento è tecnicamente valido JSON. Tuttavia non la sta usando in questo modo nel suo violino. –

risposta

7

penso che questo dovrebbe funzionare:

demo di lavoro: http://jsfiddle.net/jfriend00/YmjDR/

var data = { 
    "1b":{ 
     "allLoad":"130", 
     "loadMovement":"111", 
     "allMovement":"111" 
    }, 
    "1a":{ 
     "allLoad":"910", 
     "loadMovement":"671", 
     "allMovement":"280" 
    }, 
    "systemLoad":"963" 
}; 

var chartData = []; 

for (var i in data) { 
    var item = data[i]; 
    var outer = []; 
    // skip over items in the outer object that aren't nested objects themselves 
    if (typeof item === "object") { 
     for (var j in item) { 
      var temp = []; 
      temp.push(j); 
      temp.push(item[j]); 
      outer.push(temp); 
     } 
    } 
    if (outer.length) { 
     chartData.push(outer); 
    } 
} 
3

Si potrebbe fare qualcosa di simile a questo:

var chartData = [] 

for(var key in data) {   
    var properties = data[key]; 

    if(typeof properties === "object") { 
     var array = []; 

     for(var propKey in properties) { 
      array.push([propKey, properties[propKey]]) 
     } 

     chartData.push(array); 
    }    
} 

Dai un'occhiata allo fiddle.

3

è necessario mappare i dati manualmente. Questo è in realtà più un lavoro diligente ma di routine.

Il codice precedente ordinerà ciascun gruppo in base al relativo valore numerico e quindi mapperà una nuova matrice nello stile richiesto. Poiché .map() restituisce eventualmente valori undefined su elementi non oggetto, è necessario filtrarli prima o dopo.

Vedi http://jsfiddle.net/WjZB2/2/

+1

Solo per il riferimento, il codice può essere molto più carino: http://jsfiddle.net/Ralt/WjZB2/5/ –

0

Ho avuto problemi simili. Il mio obiettivo era quello di convertire un elenco di stringhe in un formato valido per http://ivantage.github.io/angular-ivh-treeview/

Questo è stato il mio punto di partenza:

[ 
    "A\\A1\\Test1", 
    "A\\A1\\Test2", 
    "A\\A2\\Test3", 
    "B\\Test4", 
    "B\\Test5", 
    "B\\B1\\Test6", 
    "B\\B1\\Test7", 
    "B\\B1\\Test8", 
    "C\\C1\\C1a\\Test9", 
    "C\\C1\\C1b\\Test10", 
    "C\\C2\\C2a\\Test11", 
    "C\\C2\\C2a\\Test12", 
    "C\\C2\\C2a\\Test13", 
    "C\\C3\\Test14", 
    "C\\Test15", 
    "C\\Test16" 
] 

e avevo bisogno seguente formato:

[ 
    { 
    "label": "Selected Tests", 
    "children": [ 
     { 
     "label": "A", 
     "children": [ 
      { 
      "label": "A1", 
      "children": [ 
       { 
       "label": "Test1", 
       "value": true 
       }, 
       { 
       "label": "Test2", 
       "value": true 
       } 
      ] 
      }, 
      { 
      "label": "A2", 
      "children": [ 
       { 
       "label": "Test3", 
       "value": true 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

Vedere la mia soluzione https://jsfiddle.net/ydt3gewn/

Problemi correlati