2013-03-19 217 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/

相關問題