最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

jquery - Convert one javascript nested object data structure to nested arrays - Stack Overflow

programmeradmin4浏览0评论

I am trying to convert a JSON string in a Javascript object literal. I think it is possible with some loops, but i couldn't get it done. The target structure is shown below, "chartData".

Fiddle can be found here:

Here's the JSON data:

{
   "1b":{
      "allLoad":"130",
      "loadMovement":"111",
      "allMovement":"111"
   },
   "1a":{
      "allLoad":"910",
      "loadMovement":"671",
      "allMovement":"280"
   },
   "systemLoad":"963"
}

This should it look like after the conversion:

chartData = [[['loadMovement', 111], 
              ['allMovement', 120], 
              ['allLoad', 130]], 
             [['Load+Move', 671], 
              ['allMovement', 280], 
              ['allLoad', 910]]];

I am trying to convert a JSON string in a Javascript object literal. I think it is possible with some loops, but i couldn't get it done. The target structure is shown below, "chartData".

Fiddle can be found here: http://jsbin./ajemih/13/edit

Here's the JSON data:

{
   "1b":{
      "allLoad":"130",
      "loadMovement":"111",
      "allMovement":"111"
   },
   "1a":{
      "allLoad":"910",
      "loadMovement":"671",
      "allMovement":"280"
   },
   "systemLoad":"963"
}

This should it look like after the conversion:

chartData = [[['loadMovement', 111], 
              ['allMovement', 120], 
              ['allLoad', 130]], 
             [['Load+Move', 671], 
              ['allMovement', 280], 
              ['allLoad', 910]]];
Share Improve this question edited Mar 19, 2013 at 20:19 jfriend00 708k103 gold badges1k silver badges1k bronze badges asked Mar 19, 2013 at 20:14 Michael MeierMichael Meier 6502 gold badges9 silver badges20 bronze badges 9
  • 2 The text of your question makes no sense. There's no JSON string in either of your blocks of code. Are you just asking how to convert the first javascript data structure to the second data structure? – jfriend00 Commented Mar 19, 2013 at 20:16
  • Yes. I want to convert the first data structure in the second one. – mcknight Commented Mar 19, 2013 at 20:18
  • 1 @jfriend00 his first segment is technically valid JSON. He's not using it that way in his fiddle though. – Ben McCormick Commented Mar 19, 2013 at 20:19
  • 3 @mcknight you're going to have to be more specific about what rules you want to follow here. Do you want to ignore values with primitive string keys? just ignore systemLoad? Just traverse properties in the form 1<char> ? – Ben McCormick Commented Mar 19, 2013 at 20:21
  • 2 So what have you tried so far? I couldn't find any actual attempted code in the jsbin. – Selvakumar Arumugam Commented Mar 19, 2013 at 20:22
 |  Show 4 more ments

4 Answers 4

Reset to default 8

I think this would work:

Working demo: http://jsfiddle/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);
    }
}

You could do something like this:

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

Check out the fiddle.

You need to map the data manually. Thats actually more a diligent but routine piece of work.

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

The above code will sort each group by its numeric value and then map a new array in the required style. Since .map() possibly returns undefined values on non-object elements, we need to filter those out before or afterwards.

See http://jsfiddle/WjZB2/2/

I had similar problem. My goal was to convert a list of strings into a valid format for http://ivantage.github.io/angular-ivh-treeview/

This was my starting point:

[
  "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"
]

And I needed following format:

[
  {
    "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
              }
            ]
          }
        ]
      }
    ]
  }
]

See my solution https://jsfiddle/ydt3gewn/

发布评论

评论列表(0)

  1. 暂无评论