![](/img/trans.png)
[英]Convert flat JSON file to hierarchical json data like flare.json [d3 example file]
[英]How to convert flat multi-branch data to hierarchical JSON?
[
{
"id": "a",
"pid": "a",
"name": "AA",
},
{
"id": "b",
"pid": "a",
"name": "BB",
},
{
"id": "c",
"pid": "a",
"name": "CC",
},
{
"id": "x",
"pid": "b",
"name": "XX",
}
]
以上是我從數據庫中得到的數據。 每個人都有一個id
和一個pid
, pid
指向這個人的更高級別的人的id
。 如果一個人的級別最高,則id
等於pid
。
我想將原始數據轉換為分層 JSON,如下所示:
[
{
"id": "a",
"name": "AA",
"child": [
{
"id": "b",
"name": "BB"
"child": [
{
"id": "x",
"name": "XX"
}
]
},
{
"id": "c",
"name": "CC"
}
]
}
]
我正在使用 Node.js。
我建議您創建一棵樹並以id === pid
作為樹的根,這適用於未排序的數據。
它是如何工作的:
基本上,對於數組中的每個對象,它都將構建新對象的
id
作為新對象的parentid
。例如:
{ "id": 6, "pid": 4 }
它首先使用
id
生成此屬性:"6": { "id": 6, "pid": 4 }
然后使用
pid
:"4": { "children": [ { "id": 6, "pid": 4 } ] },
雖然所有對象都被類似地處理,但我們最終得到了一棵樹。
如果
id === pid
,則找到根節點。 這是以后返回的對象。
var data = [ { "id": "f", "pid": "b", "name": "F" }, { "id": "e", "pid": "c", "name": "E" }, { "id": "d", "pid": "c", "name": "D" }, { "id": "c", "pid": "b", "name": "C" }, { "id": "a", "pid": "a", "name": "A" }, { "id": "b", "pid": "a", "name": "B" } ], tree = function (data) { var r, o = Object.create(null); data.forEach(function (a) { a.children = o[a.id] && o[a.id].children; o[a.id] = a; if (a.id === a.pid) { r = a; } else { o[a.pid] = o[a.pid] || {}; o[a.pid].children = o[a.pid].children || []; o[a.pid].children.push(a); } }); return r; }(data); console.log(tree);
受妮娜的回答影響,這是我的決心,僅供記錄。
function corrugate(data){ var root = ""; return data.reduce((t,o) => { o.id === o.pid && (root = o.id); t[o.id] ? t[o.id].name = o.name : t[o.id] = {id: o.id, name: o.name}; t[o.pid] ? o.pid !== o.id ? t[o.pid].children.push(t[o.id]) : t[o.pid].children = t[o.pid].children || [] : t[o.pid] = {id: o.pid, children: [t[o.id]]}; return t; },{})[root]; } var data = [{ "id": "f", "pid": "b", "name": "F" }, { "id": "e", "pid": "c", "name": "E" }, { "id": "b", "pid": "a", "name": "B" }, { "id": "d", "pid": "c", "name": "D" }, { "id": "c", "pid": "b", "name": "C" }, { "id": "a", "pid": "a", "name": "A" } ]; console.log(corrugate(data));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.