[ { "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。
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 === pid
这个怎么运作: 基本上,对于数组中的每个对象,都需要像id构建新对象一样使用来构建parentid新对象。 例如: { "id": 6, "pid": 4 } 它首先使用id以下命令生成此属性: "6": { "id": 6, "pid": 4 } 然后用pid: "4": { "children": [ { "id": 6, "pid": 4 } ] }, 在对所有对象进行类似处理的同时,我们最终得到了一棵树。 如果为id === pid,则找到根节点。这是以后返回的对象。
这个怎么运作:
基本上,对于数组中的每个对象,都需要像id构建新对象一样使用来构建parentid新对象。
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);