2013-03-19 16 views
5

Próbuję przekonwertować ciąg JSON w literalnym obiekcie JavaScript. Myślę, że jest to możliwe z niektórymi pętlami, ale nie mogłem tego zrobić. Struktura docelowa jest pokazana poniżej, "chartData".Konwersja struktury danych zagnieżdżonego obiektu javascript do zagnieżdżonych tablic

Fiddle można znaleźć tutaj: http://jsbin.com/ajemih/13/edit

Oto dane JSON:

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

Powinno to wyglądać po konwersji:

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

Tekst pytania nie ma sensu. W żadnym z bloków kodu nie ma ciągów JSON. Czy właśnie pytasz, jak przekonwertować pierwszą strukturę danych javascript do drugiej struktury danych? – jfriend00

+0

Tak. Chcę przekonwertować pierwszą strukturę danych w drugiej. – mcknight

+1

@ jfriend00 jego pierwszy segment jest technicznie poprawny JSON. Jednak nie używa go w ten sposób w swoim skrzypcach. –

Odpowiedz

7

myślę, że to będzie działać:

demo Praca: 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

mógłby zrobić coś takiego:

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

Zapoznaj się z fiddle.

3

Trzeba ręcznie mapować dane. To rzeczywiście bardziej pracowity, ale rutynowy element pracy.

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

Powyższy kod spowoduje posortowanie każdej grupy przez jej wartości numerycznej, a następnie zmapować nową tablicę w wymaganej stylu. Ponieważ .map() prawdopodobnie zwraca wartości undefined na elementach nieobiektowych, musimy je odfiltrować przed lub po.

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

+1

Tylko w celach informacyjnych kod może być znacznie ładniejszy: http://jsfiddle.net/Ralt/WjZB2/5/ –

0

miałem podobny problem. Moim celem było przekonwertować listy ciągów w prawidłowym formacie dla http://ivantage.github.io/angular-ivh-treeview/

To był mój punkt wyjścia:

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

I potrzebne następujący 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 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

Zobacz moje rozwiązanie https://jsfiddle.net/ydt3gewn/

Powiązane problemy