2013-03-19 14 views
5

Ich versuche, eine JSON-Zeichenfolge in einem Javascript-Objektliteral zu konvertieren. Ich denke, dass es mit einigen Schleifen möglich ist, aber ich konnte es nicht schaffen. Die Zielstruktur wird unten "chartData" angezeigt.Konvertieren Sie eine geschachtelte JavaScript-Objektdatenstruktur in geschachtelte Arrays

Fiddle finden Sie hier: http://jsbin.com/ajemih/13/edit

Hier ist die JSON-Daten:

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

Dies sollte es nach der Umstellung wie folgt aussehen:

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

Der Text Ihrer Frage ergibt keinen Sinn. In keinem Ihrer Code-Blöcke befindet sich eine JSON-Zeichenfolge. Fragen Sie nur, wie Sie die erste JavaScript-Datenstruktur in die zweite Datenstruktur konvertieren? – jfriend00

+0

Ja. Ich möchte die erste Datenstruktur in der zweiten konvertieren. – mcknight

+1

@ jfriend00 sein erstes Segment ist technisch gültiger JSON. Er benutzt es jedoch nicht so in seiner Geige. –

Antwort

7

ich denke, das würde funktionieren:

Arbeits Demo: 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

Man könnte so etwas tun:

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); 
    }    
} 

Überprüfen Sie die fiddle.

3

Sie müssen die Daten manuell abzubilden. Das ist eigentlich eher eine fleißige Routinearbeit.

var jsonData = 'your json string'; 

Object.keys(jsonData).map(function(key) { 
    if(typeof jsonData[ key ] === 'object') { 
     return Object.keys(jsonData[ key ]).sort(function(a, b) { 
      return +jsonData[ key ][ a ] - +jsonData[ key ][ b ]; 
     }).map(function(name) { 
      return [ name, jsonData[ key ][ name ] ]; 
     }); 
    } 
}).filter(Boolean); 

Der obige Code sortiert jede Gruppe nach ihrem numerischen Wert und bildet dann ein neues Array im gewünschten Stil ab. Da .map() möglicherweise undefined Werte auf Nichtobjektelemente zurückgibt, müssen wir diese vor oder nachher filtern.

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

+1

Nur für die Referenz kann der Code viel hübscher sein: http://jsfiddle.net/Ralt/WjZB2/5/ –

0

ich ähnliches Problem hatte. Mein Ziel war es, eine Liste von Strings in ein gültiges Format für http://ivantage.github.io/angular-ivh-treeview/

Das war mein Ausgangspunkt zu konvertieren:

[ 
    "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" 
] 

Und ich brauchte folgendes Format:

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

meine Lösung Siehe https://jsfiddle.net/ydt3gewn/