Если вы хотите избежать поиска по всему дереву, когда вам это нужно, лучше предварительно обработать ваше дерево, чтобы вы могли найти любой узел (объект) напрямую, в постоянное время, учитывая его secCode
.
Вы можете создать Map
для этого соединения между secCode
и узлом:
// Creates a map which is keyed by secCode, and for a secCode provides
// the corresponding node from the tree
function createMap(tree) {
let map = new Map;
function recur(node) {
map.set(node.secCode, node);
if (node.children) node.children.forEach(recur);
}
tree.forEach(recur);
return map;
}
// Uses the map to walk up the tree
function getParents(secCode, map) {
let parents = [];
while (secCode) {
parents.push(secCode);
let node = map.get(secCode);
secCode = node.prevSec;
}
return parents;
}
// The tree from the question:
let tree = [{"secCode": 2,"secName": "GENERAL NURSING CARE SECTION","prevSec": 0,},{"secCode": 1,"secName": "CRITICAL CARE NURSING SECTION","prevSec": 0,"children": [{"secCode": 3,"secName": "OPERATION THEATRE","prevSec": 1,"children": [{"secCode": 5,"secName": "MAIN OPERATION THEATRE","prevSec": 3,"estCode": 152,},{"secCode": 6,"secName": "DAY CARE DT SERVICE","prevSec": 3,}]},{"secCode": 4,"secName": "CRITICAL CARE SERVICES","prevSec": 1,"children": [{"secCode": 675,"secName": "Test","prevSec": 4,"children": [{"secCode": 676,"secName": "Test1","prevSec": 675,},{"secCode": 677,"secName": "Test 2","prevSec": 675,},{"secCode": 678,"secName": "Test 3","prevSec": 675,},{"secCode": 679,"secName": "Test 4","prevSec": 675,}]},{"secCode": 7,"secName": "ACUTE CARE","prevSec": 4,}]}]}];
// Preprocessing
let map = createMap(tree);
// Example calls:
console.log(getParents(7, map));
console.log(getParents(679, map));
Обратите внимание, что у дерева в вашем примере 4 не является дочерним по отношению к 3, как показывают ваши примеры - 4 является дочерним по отношению к 1.
Если у вас есть класс, вы, конечно, можете создать эту карту в его конструкторе и назначить его свойству:
class Tree {
constructor(data) {
this.map = new Map;
const recur = (node) => {
this.map.set(node.secCode, node);
if (node.children) node.children.forEach(recur);
}
data.forEach(recur);
}
getParents(secCode) {
let parents = [];
while (secCode) {
parents.push(secCode);
secCode = this.map.get(secCode).prevSec;
}
return parents;
}
}
// The tree from the question:
let data = [{"secCode": 2,"secName": "GENERAL NURSING CARE SECTION","prevSec": 0,},{"secCode": 1,"secName": "CRITICAL CARE NURSING SECTION","prevSec": 0,"children": [{"secCode": 3,"secName": "OPERATION THEATRE","prevSec": 1,"children": [{"secCode": 5,"secName": "MAIN OPERATION THEATRE","prevSec": 3,"estCode": 152,},{"secCode": 6,"secName": "DAY CARE DT SERVICE","prevSec": 3,}]},{"secCode": 4,"secName": "CRITICAL CARE SERVICES","prevSec": 1,"children": [{"secCode": 675,"secName": "Test","prevSec": 4,"children": [{"secCode": 676,"secName": "Test1","prevSec": 675,},{"secCode": 677,"secName": "Test 2","prevSec": 675,},{"secCode": 678,"secName": "Test 3","prevSec": 675,},{"secCode": 679,"secName": "Test 4","prevSec": 675,}]},{"secCode": 7,"secName": "ACUTE CARE","prevSec": 4,}]}]}];
// Preprocessing
let tree = new Tree(data);
// Example calls:
console.log(tree.getParents(7));
console.log(tree.getParents(679));