5

JSON 文字列を Javascript オブジェクト リテラルに変換しようとしています。いくつかのループで可能だと思いますが、実行できませんでした。対象となる構造体は以下の「chartData」です。

フィドルはここにあります: 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]]];
4

4 に答える 4

8

私はこれがうまくいくと思います:

実際のデモ: 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);
    }
}
于 2013-03-19T20:25:11.313 に答える
4

データを手動でマッピングする必要があります。それは実際にはもっと勤勉ですが日常的な仕事です。

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/を参照してください

于 2013-03-19T20:25:24.817 に答える
4

次のようなことができます。

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

フィドルをチェックしてください。

于 2013-03-19T20:23:49.130 に答える
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/

于 2016-09-19T06:38:52.373 に答える