2013-03-19 4 views
5

Я пытаюсь преобразовать строку JSON в литерал объекта Javascript. Я думаю, что это возможно с некоторыми циклами, но я не мог это сделать. Целевая структура показана ниже, «chartData».Преобразование одной структуры данных вложенных объектов javascript в вложенные массивы

Fiddle можно найти здесь: http://jsbin.com/ajemih/13/edit

Вот данные JSON:

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

Это она должна выглядеть после преобразования:

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

Текст вашего вопроса не имеет смысла. В любом из ваших блоков кода нет строки JSON. Вы просто спрашиваете, как преобразовать первую структуру данных javascript во вторую структуру данных? – jfriend00

+0

Да. Я хочу преобразовать первую структуру данных во вторую. – mcknight

+1

@ jfriend00 его первый сегмент технически справедлив JSON. Тем не менее, он не использует его в своей скрипке. –

ответ

7

Я думаю, что это будет работать:

Работа демо: 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

Вы могли бы сделать что-то вроде этого:

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

Проверьте fiddle.

3

Вам необходимо сопоставить данные вручную. Это на самом деле более прилежная, но рутинная работа.

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

Приведенный выше код будет сортировать каждую группу по ее числовому значению, а затем отображать новый массив в требуемом стиле. Поскольку .map(), возможно, возвращает значения undefined для элементов без объекта, нам необходимо отфильтровать их до или после.

См http://jsfiddle.net/WjZB2/2/

+1

Только для справки код может быть более красивым: http://jsfiddle.net/Ralt/WjZB2/5/ –

0

У меня была аналогичная проблема. Моя цель состояла в том, чтобы преобразовать список строк в правильный формат для http://ivantage.github.io/angular-ivh-treeview/

Это было моей отправной точкой:

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

И мне нужен следующий формат:

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

Смотрите мое решение https://jsfiddle.net/ydt3gewn/

Смежные вопросы