2013-03-19 135 views
5

我想转换一个JavaScript对象字面值中的JSON字符串。我认为这是可能的一些循环,但我无法完成。目标结构如下所示,“chartData”。将一个javascript嵌套对象数据结构转换为嵌套数组

小提琴可以在这里找到: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 2013-03-19 20:16:51

+0

是的。我想转换第二个数据结构。 – mcknight 2013-03-19 20:18:01

+1

@ jfriend00他的第一部分技术上是有效的JSON。尽管如此,他并没有如此使用它。 – 2013-03-19 20:19:44

回答

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/ – 2013-03-19 20:54:30

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/