2013-03-19 78 views
5

Tôi đang cố chuyển đổi một chuỗi JSON trong một đối tượng Javascript theo nghĩa đen. Tôi nghĩ rằng nó có thể với một số vòng, nhưng tôi không thể làm cho nó được thực hiện. Cấu trúc đích được hiển thị bên dưới, "chartData".Chuyển đổi một cấu trúc dữ liệu đối tượng lồng nhau javascript thành các mảng lồng nhau

Fiddle có thể được tìm thấy ở đây: http://jsbin.com/ajemih/13/edit

Dưới đây là các dữ liệu JSON:

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

này nó sẽ giống như sau khi chuyển đổi:

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

Nội dung câu hỏi của bạn không có ý nghĩa. Không có chuỗi JSON nào trong một trong hai khối mã của bạn. Bạn chỉ cần hỏi làm thế nào để chuyển đổi cấu trúc dữ liệu javascript đầu tiên sang cấu trúc dữ liệu thứ hai? – jfriend00

+0

Có. Tôi muốn chuyển đổi cấu trúc dữ liệu đầu tiên trong cấu trúc thứ hai. – mcknight

+1

@ jfriend00 phân đoạn đầu tiên của anh ấy là JSON hợp lệ về mặt kỹ thuật. Anh ta không sử dụng nó theo cách đó. –

Trả lời

7

Tôi nghĩ rằng điều này sẽ làm việc:

bản demo làm việc: 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

Bạn có thể làm một cái gì đó như thế này:

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

Khám phá số fiddle.

3

Bạn cần để ánh xạ dữ liệu bằng tay. Đó thực sự là một tác phẩm siêng năng nhưng thông thường.

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

Mã trên sẽ sắp xếp từng nhóm theo giá trị số và sau đó ánh xạ mảng mới theo kiểu bắt buộc. Vì .map() có thể trả về giá trị undefined trên các phần tử không phải đối tượng, chúng tôi cần phải lọc các giá trị đó trước hoặc sau đó.

Xem http://jsfiddle.net/WjZB2/2/

+1

Chỉ để tham khảo, mã có thể đẹp hơn: http://jsfiddle.net/Ralt/WjZB2/5/ –

0

Tôi gặp sự cố tương tự. Mục tiêu của tôi là để chuyển đổi một danh sách các chuỗi sang một định dạng hợp lệ cho http://ivantage.github.io/angular-ivh-treeview/

Đây là điểm khởi đầu của tôi:

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

Và tôi cần định dạng sau:

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

Xem giải pháp của tôi https://jsfiddle.net/ydt3gewn/

Các vấn đề liên quan