2013-03-19 10 views
5

JavascriptオブジェクトリテラルでJSON文字列を変換しようとしています。私はそれがいくつかのループで可能だと思うが、私はそれを完了することができませんでした。ターゲット構造を以下に示します。 "chartData"。1つの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データ構造を第2のデータ構造に変換する方法を尋ねていますか? – jfriend00

+0

はい。私は最初のデータ構造を2番目のデータ構造に変換したい。 – 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/