Javascript 如何将平面多分支数据转换为分层JSON?
上面是我从数据库中得到的数据。每个人都有一个Javascript 如何将平面多分支数据转换为分层JSON?,javascript,node.js,algorithm,tree,Javascript,Node.js,Algorithm,Tree,上面是我从数据库中得到的数据。每个人都有一个id和一个pid,pid指向该人更高级别的id。如果一个人具有最高级别,则id等于pid 我想将原始数据转换为分层JSON,如下所示: [ { "id": "a", "pid": "a", "name": "AA", }, { "id": "b", "pid": "a", "name": "BB", }, { "id": "c", "pid": "a", "na
id
和一个pid
,pid
指向该人更高级别的id
。如果一个人具有最高级别,则id
等于pid
我想将原始数据转换为分层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",
}
]
我正在使用Node.js。我建议您创建一个树,并将
id==pid
作为树的根,该树适用于未排序的数据
工作原理:
基本上,对于数组中的每个对象,它将用于构建新对象的id
作为新对象的parentid
例如:
[
{
"id": "a",
"name": "AA",
"child": [
{
"id": "b",
"name": "BB"
"child": [
{
"id": "x",
"name": "XX"
}
]
},
{
"id": "c",
"name": "CC"
}
]
}
]
它首先使用id
生成此属性:
{ "id": 6, "pid": 4 }
"6": {
"id": 6,
"pid": 4
}
然后使用pid
:
{ "id": 6, "pid": 4 }
"6": {
"id": 6,
"pid": 4
}
当所有对象都被类似地处理时,我们最终得到了一棵树
如果id==pid
,则找到根节点。这是稍后返回的对象
var数据=[
{“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”}
],
树=函数(数据){
var r,o=Object.create(null);
data.forEach(函数(a){
a、 children=o[a.id]&&o[a.id];
o[a.id]=a;
如果(a.id==a.pid){
r=a;
}否则{
o[a.pid]=o[a.pid]|{};
o[a.pid]。children=o[a.pid]。children | |[];
o[a.pid].children.push(a);
}
});
返回r;
}(数据);
控制台日志(树)代码>受尼娜回答的影响,这是我的决议,仅供记录在案
功能波纹(数据){
var root=“”;
返回数据。减少((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,子项:[t[o.id]]};
返回t;
},{}[根];
}
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”}
];
日志(波纹状(数据))
数据是按id排序的,还是随机排序的?@NinaScholz它是随机排序的,但id是唯一的。您如何知道树的根?请添加更多数据以供检查。@NinaScholz当id
等于pid
时,他是根。我更新了问题,谢谢@谢谢你!我现在知道怎么解决这种问题了!值得一提的是,这个出色的算法充分利用了JS中对象是引用类型的优点。这一事实简单地节省了大量的排序工作。@AlexeiLevenkov,引用是我的一部分,它不是从其他地方复制的。@NinaScholz好的,只是想检查编辑是否合理。(我不会对特定帖子的内容使用引用格式……但我认为没有任何强有力的指导来反对它)。(读取时标记为“不再需要”)