Javascript 如何组织类别集合?
我有一个类别集合及其所有子类别,我通过ajax从服务器获得这些类别。 现在我想以一种方式对它们进行排序,使每个子类别都位于相关的父类别之下 这是“所有类别”集合:Javascript 如何组织类别集合?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个类别集合及其所有子类别,我通过ajax从服务器获得这些类别。 现在我想以一种方式对它们进行排序,使每个子类别都位于相关的父类别之下 这是“所有类别”集合: [ {id: 28, name: "category1", parent_id: null}, {id: 29, name: "category2", parent_id: null}, {id: 30, name: "category3", parent_id: null}, {id: 31, na
[
{id: 28, name: "category1", parent_id: null},
{id: 29, name: "category2", parent_id: null},
{id: 30, name: "category3", parent_id: null},
{id: 31, name: "category4", parent_id: 28},
{id: 32, name: "category5", parent_id: 28},
{id: 33, name: "category6", parent_id: 28},
{id: 34, name: "category7", parent_id: 31},
{id: 35, name: "category8", parent_id: 31},
{id: 36, name: "category9", parent_id: 29},
]
parent\u id:null
表示它是父类别,parent\u id
的任何其他数字都指向父类别
反正
我想用这些数据创建一个集合,如下所示:
[
{id: 28, name: "category1", parent_id: null,
children : [
{id: 31, name: "category4", parent_id: 28, [
children : [
{id: 34, name: "category7", parent_id: 31},
{id: 35, name: "category8", parent_id: 31},
]},
{id: 32, name: "category5", parent_id: 28},
{id: 33, name: "category6", parent_id: 28},
]},
{id: 29, name: "category2", parent_id: null,
children: [
{id: 36, name: "category9", parent_id: 29},
]},
{id: 30, name: "category3", parent_id: null},
]
首先,为孩子绘制一张父母地图:
const parentChilds = new Map;
for(const el of data){
const pid = el.parent_id;
if(parentChilds.has(pid)){
parentChilds.get(pid).push(el);
} else {
parentChilds.set(pid, [el]);
}
}
现在我们只需要将子数组存储在父数组中:
for(const el of data)
el.children = parentChilds.get(el.id) || [];
要仅获取顶级元素,只需过滤没有父元素的元素:
const result = data.filter(el => !el.parent_id);
实际上,您可以在一个循环中完成这一切:
const parentChilds = new Map;
const result = [];
for(const el of data){
const {id, parent_id: pid} = el;
if(parentChilds.has(id)) {
el.children = parentChilds.get(id);
} else {
parentChilds.set(id, el.children = []);
}
if(pid){
if(parentChilds.has(pid)){
parentChilds.get(pid).push(el);
} else {
parenChilds.set(pid, [el]);
}
} else {
result.push(el);
}
}
酷。我想要一个里面有特斯拉的火箭。你试过什么?很多次,社区都会回答这种问题。我不明白为什么!。。。很多类似的问题都被解决了,因为OP没有表现出任何努力。这很有趣,社区如何回答这个问题,有时会关闭它。这取决于人们醒来时是否有“帮助”的意图。所有这些答案都应该关闭@ele@JonasW。你什么意思?非常感谢。那是我的answer@hesan很乐意帮忙;)但有一个问题。第二段代码,仅当父类别在子类别之前时才有效?