Chiến lược là tạo cấu trúc dữ liệu trống mới tương ứng với những gì bạn muốn và sau đó điền vào nó bằng cách trải qua toàn bộ tập dữ liệu gốc. Đây là mã:
var data = [
{ "dep": "d1", "name": "name1", "size": "size1" },
{ "dep": "d1", "name": "name2", "size": "size2" },
{ "dep": "d2", "name": "name1", "size": "size3" },
{ "dep": "d2", "name": "name2", "size": "size4" }
]
var newData = {"name": "root", "children": {}}
data.forEach(function (d) {
if (typeof newData.children[d.dep] !== 'undefined') {
newData.children[d.dep].children.push(d)
} else {
newData.children[d.dep] = {"name": d.dep, "children": [d]}
}
})
newData.children = Object.keys(newData.children).map(function (key) {
return newData.children[key];
});
Bài tập cuối cùng là chuyển đối tượng thành mảng.
Mà cho kết quả mong muốn cho newData
:
{
"name": "root",
"children": [
{ "name": "d1",
"children": [
{ "dep": "d1", "name": "name1", "size": "size1" },
{ "dep": "d1", "name": "name2", "size": "size2" }
]
},
{ "name": "d2",
"children": [
{ "dep": "d2", "name": "name1", "size": "size3" },
{ "dep": "d2", "name": "name2", "size": "size4" }
]
}
]
}
jsFiddle:http://jsfiddle.net/chrisJamesC/eB4jF/
Lưu ý: Phương pháp này không làm việc cho các cấu trúc lồng nhau. Nó sẽ là cách khó hơn để làm điều này cho các cấu trúc lồng nhau nhưng bạn luôn có thể sử dụng một hàm đệ quy.
EDIT: Theo đề nghị của @imarane trong câu trả lời của mình, bạn có thể sử dụng d3.nest() đó là cách tốt hơn so với bàn tay của tôi đã giải quyết. Do đó bạn có thể chấp nhận câu trả lời của mình. Bằng cách chơi với nó, thậm chí nó là rất dễ dàng để có nhiều cấp độ của tổ:
var data = [
{ "dep": "d1", "name": "name1", "size": "size1" },
{ "dep": "d1", "name": "name2", "size": "size2" },
{ "dep": "d2", "name": "name1"},
{ "dep": "d2"}
]
var newData = {
"key":"root",
"children":
d3.nest()
.key(function(d){return d.dep})
.key(function(d){return d.name})
.key(function(d){return d.size})
.entries(data)
}
nào cho:
{"key":"root","children":[
{"key":"d1","values":[
{"key":"name2","values":[
{"dep":"d1","name":"name2","size":"size1"},
{"dep":"d1","name":"name2","size":"size2"}
]}
]},
{"key":"d2","values":[
{"key":"name1","values":[
{"dep":"d2","name":"name1"}
]},
{"key":"undefined","values":[
{"dep":"d2"}
]}
]}
]}
Những cấu trúc dữ liệu sau (Tôi hy vọng tốt hơn để hiểu toàn bộ điểm):
var data = [
{ "dep": "d1", "name": "name2", "size": "size1" },
{ "dep": "d1", "name": "name2", "size": "size2" },
{ "dep": "d2", "name": "name1"},
{ "dep": "d2"}
]
JsFiddle:http://jsfiddle.net/chrisJamesC/eB4jF/2/
Thông tin thêm về Nest:http://bl.ocks.org/phoebebright/raw/3176159/
FYI, trong khi bạn có thể nhận dữ liệu dưới dạng JSON khi bạn chuyển đổi nó, bạn đang làm việc với các đối tượng và mảng JavaScript. Tại thời điểm này, vấn đề không liên quan gì đến JSON nữa. –
http://stackoverflow.com/questions/17847131/generate-multilevel-flare-json-data-format-from-flat-json Điều này sẽ giải quyết được mục đích của bạn. –
Bạn đã tạo cấu trúc dữ liệu Json ban đầu như thế nào? Bạn đã có nguồn dữ liệu và được thêm vào dữ liệu chưa? Hay chỉ là mã cứng? –