5

我正在尝试在 Javascript 对象文字中转换 JSON 字符串。我认为有一些循环是可能的,但我无法完成。目标结构如下所示,“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 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 回答
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 回答
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 回答