将一个javascript嵌套对象数据结构转换为嵌套数组

时间:2013-03-19 20:14:15

标签: javascript jquery json object loops

我正在尝试在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 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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);
    }             
}

查看fiddle

答案 2 :(得分: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/

答案 3 :(得分: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/