Ausgabe
Was ich brauche, ist, ein Breadcrumb aus einem JSON zu erstellen, das die Struktur des Breadcrumb definiert.
Parent / Node >Comm> Forms Code>Test Menu
Problem
Im geschachtelten Json-Objekt bezieht sich parent_id auf die ID im JSON-Objekt.
Js-Code
ngOnInit() {
let data = [];
let jsonValues = JSON.stringify(this.jasonData1);
const main_menu_items = JSON.parse(jsonValues);
var treeNodes = [];
this.childernNodes = nestedChildrens(main_menu_items.value, 0);
console.log(this.childernNodes);
function nestedChildrens(nodes, level) {
//treeNodes[level] = treeNodes[level] || [];
var total = 0;
nodes.children.forEach(node => {
var ccount = 0;
if ("children" in node) {
var ccount = nestedChildrens(node, total + 1);
} else {
ccount = 1;
}
// console.log(node.parent_id);
treeNodes.push({
node,
tree_node: total
});
total += ccount;
});
const sorted = Object.values(treeNodes).sort(
(a, b) => a.node.id - b.node.id
);
return sorted;
}
}
}
Stapelblitz
https://stackblitz.com/edit/angular-tree-node-test-znreuv
Jeder Vorschlag ist sehr willkommen
Lösung
Erstellen Sie ein Wörterbuch mit Knoten, die nach ID indiziert sind. Beginnen Sie dann beim Blattknoten, folgen Sie den parent_ids und holen Sie sich die übergeordneten Knoten aus dem Wörterbuch, das Sie am Anfang erstellt haben. Hängen Sie dabei die Knoten an den Anfang eines Arrays an, das den Breadcrumb darstellt.
Etwas wie:
Beim Überqueren:
nodesDictionary[node.id] = {
node,
tree_node: total
};
Dann:
let currentNode = nodesDictionary["156"];
while (currentNode && currentNode.node.parent_id) {
this.childernNodes = [currentNode, ...this.childernNodes];
currentNode = nodesDictionary[currentNode.node.parent_id];
}
https://stackblitz.com/edit/angular-tree-node-test-hphtlw?file=src/app/app.component.ts
Beantwortet von – Tiago Coelho
Antwort geprüft von – Gilberto Lyons (FixError Admin)