У меня есть дерево объектов, составленных со следующей структурой:Рекурсивных найти путь произвольного узла в дереве
interface Node {
name: string;
children?: Node[];
}
Где, например, { name: "foo", children: [ { name: "bar" } ] }
является допустимым деревом. Я пытаюсь получить адрес произвольного узла, который может быть листом, возвращенным как массив пути для его получения, где узел будет сравниваться с помощью ссылки на объект. Пример дано, я иметь следующую структуру:
var data = {
name: "Languages",
children: [{
name: "Functional",
children: [
{ name: "OCaml" },
{ name: "Haskell" },
{ name: "Erlang" }
]
}, {
name: "Imperative",
children: [
{ name: "BASIC" },
{ name: "Clipper" }
]
}]
};
Ожидается, что, например, если у меня есть ссылка на OCaml
хранится в переменной под названием ocaml
, который указывает в точности этой ссылки в памяти, массив шагов возвращаться с путём для его достижения, что в данном случае будет [0, 0]
.
Я уже могу найти объект, но я не в состоянии сохранить предыдущий индекс, так как это не является детерминированным:
var tree = function(struct, cmp) {
if (struct.children) {
var lookup = [];
for (var i = 0; i < struct.children.length; i++) {
lookup.push(tree(struct.children[i], cmp));
}
return lookup;
} else {
if (struct === cmp) {
return "PASS";
}
return "FAIL";
}
}
я могу найти элемент, но как я могу сохранить предыдущий индексы, чтобы достичь его с базы?
Это не похоже на то, что ваша функция делает то, что вы пытаетесь сделать вообще. Каков результат этой функции? – Amit
У меня будет массив, содержащий другие массивы в виде узлов, и каждый лист будет либо «PASS», либо «FAIL», поэтому я могу ** найти ** элемент, но я не могу найти индексы, чтобы достичь его, потому что это не является детерминированным, и я не знаю, как я мог хранить предыдущие индексы и отказаться от непревзойденного. –
Просто сохраните указатель на родительский узел в каждом дочернем элементе, например 'interface Node {parent: Node; name: string; ...} ' – ankhzet