Javascript 将平面列表转换为父子树
我正在尝试从一个简单的列表中构建一棵树,我知道我遗漏了一些可以让这变得更简单、更快的东西。我试过几种方法。最新的是我在下面发布的函数 平面列表如下所示:Javascript 将平面列表转换为父子树,javascript,arrays,Javascript,Arrays,我正在尝试从一个简单的列表中构建一棵树,我知道我遗漏了一些可以让这变得更简单、更快的东西。我试过几种方法。最新的是我在下面发布的函数 平面列表如下所示: var input = [ { "Parent Category": "Agricultural Feed + Seed", Category: "Agricultural Feed + Seed", Name: "Agfinity" }, { "Parent Category": "Agricult
var input = [
{
"Parent Category": "Agricultural Feed + Seed",
Category: "Agricultural Feed + Seed",
Name: "Agfinity"
},
{
"Parent Category": "Agricultural Feed + Seed",
Category: "Agricultural Feed + Seed",
Name: "Agland Co-op"
},
{
"Parent Category": "Agricultural Feed + Seed",
Category: "Agricultural Equipment",
Name: "Agri Supply"
},
{
"Parent Category": "Agricultural Equipment",
Category: "Tractors",
Name: "Agway"
},
{
"Parent Category": "Agricultural Equipment",
Category: "Tractors",
Name: "Agway2"
},
{
"Parent Category": "Travel",
Category: "Travel",
Name: "Amtrak"
},
{
"Parent Category": "Travel",
Category: "Accessories",
Name: "Bentley Leathers & Luggage"
}
];
[
{
"label": "Agricultural Feed + Seed",
"children": [
{
"label": "Agfinfity"
},
{
"label": "Agland Co-op"
},
{
"label": "Agricultural Equipment",
"children": [
{
"label": "Agri Supply"
"children": [
{
"label": "Tractors",
"children": [
{
"label": "Agway"
},
{
"label": "Agway2"
}
]
}
]
}
]
}
]
},
{
"label": "Travel",
"children": [
{
"label": "Amtrak"
},
{
"label": "Acessories",
"children": [
{
"label": "Bentley Leathers & Luggage"
},
}
]
}
];
从这个列表中,我试图构建一个如下所示的树:
var input = [
{
"Parent Category": "Agricultural Feed + Seed",
Category: "Agricultural Feed + Seed",
Name: "Agfinity"
},
{
"Parent Category": "Agricultural Feed + Seed",
Category: "Agricultural Feed + Seed",
Name: "Agland Co-op"
},
{
"Parent Category": "Agricultural Feed + Seed",
Category: "Agricultural Equipment",
Name: "Agri Supply"
},
{
"Parent Category": "Agricultural Equipment",
Category: "Tractors",
Name: "Agway"
},
{
"Parent Category": "Agricultural Equipment",
Category: "Tractors",
Name: "Agway2"
},
{
"Parent Category": "Travel",
Category: "Travel",
Name: "Amtrak"
},
{
"Parent Category": "Travel",
Category: "Accessories",
Name: "Bentley Leathers & Luggage"
}
];
[
{
"label": "Agricultural Feed + Seed",
"children": [
{
"label": "Agfinfity"
},
{
"label": "Agland Co-op"
},
{
"label": "Agricultural Equipment",
"children": [
{
"label": "Agri Supply"
"children": [
{
"label": "Tractors",
"children": [
{
"label": "Agway"
},
{
"label": "Agway2"
}
]
}
]
}
]
}
]
},
{
"label": "Travel",
"children": [
{
"label": "Amtrak"
},
{
"label": "Acessories",
"children": [
{
"label": "Bentley Leathers & Luggage"
},
}
]
}
];
我有一个这样的函数,几乎可以工作,但我知道这不是正确的方法
function formatBrandNames(rawBrands) {
let output = [];
for (let i = 0; i < rawBrands.length; i++) {
// Parent Category
if (!output.find(v => v.label === rawBrands[i]["Parent Category"])) {
output.push({
label: rawBrands[i]["Parent Category"],
children: []
});
}
// Category
let parentCat = output.find(v => v.label === rawBrands[i]["Parent Category"]);
if (rawBrands[i]["Category"] === parentCat.label) {
const name = trimBrandNumbers(rawBrands[i]["Name"]);
parentCat.children.push({ label: name });
continue;
}
if (!parentCat.children.find(v => v.label === rawBrands[i]["Category"])) {
parentCat.children.push({ label: rawBrands[i]["Category"], children: [] });
}
// Name
let cat = parentCat.children.find(v => v.label === rawBrands[i]["Category"]);
const name = trimBrandNumbers(rawBrands[i]["Name"]);
cat.children.push({ label: name });
}
return output;
}
函数formatBrandNames(rawBrands){
让输出=[];
for(设i=0;iv.label==rawBrands[i][“父类别”])){
输出推送({
标签:rawBrands[i][“父类别”],
儿童:[]
});
}
//类别
让parentCat=output.find(v=>v.label==rawBrands[i][“父类别]);
if(rawBrands[i][“类别”]==parentCat.label){
const name=TrimbrandNumber(rawBrands[i][“name]”);
parentCat.children.push({label:name});
继续;
}
if(!parentCat.children.find(v=>v.label===rawBrands[i][“Category”])){
parentCat.children.push({label:rawBrands[i][“Category”],children:[]});
}
//名字
让cat=parentCat.children.find(v=>v.label==rawBrands[i][“Category]”);
const name=TrimbrandNumber(rawBrands[i][“name]”);
cat.children.push({label:name});
}
返回输出;
}
如果您对此有任何帮助或见解,我们将不胜感激。逻辑可以简化为 如果节点没有父类别,则它是根类别之一 按父节点的类别查找父节点,然后将节点添加到父节点的子节点 如果父级不存在,请创建它
每个节点都有一个
ParentCategory
?可能重复yes@jonaswillms,但有些节点有相同的类别和父类别。这很有趣。哦,是的,如果我将条件更改为if(Parent==Category)
,这几乎是正确的,我只是在为孩子们摆脱空数组。这远不是完美的,而是一个起点