У меня есть выбор дерева, в котором у каждого узла есть имя. Я хочу выполнить поиск по именам узлов и вернуть подмножество дерева, которое содержит только найденные узлы и его родителей.
Кто-нибудь знает эффективный алгоритм в JavaScript для этой проблемы, который возвращает узел со всеми его родителей.
Вот пример. когда пользователь вводит поисковый запрос, пример «Слон» и дерево выглядит следующим образом:
Хотел бы вывести результат поиска в древовидном формате с детьми, как это:
Дано:
this.tree =[
{childs: Array(2), id: 2, name: "Elephant", …}
{childs: Array(2), id: 3, name: "Hamster", ...}
{childs: Array(2), id: 3, name: "Dog", ...}
{childs: Array(2), id: 3, name: "Elephant", ...}
]
Дано
// animal target name
target = 'Elephant',
// tree data structure
tree = [
{ name: 'Elephant', childs: [
{ name: 'Duck' },
{ name: 'Hamster', childs: [
{ name: 'Fish' }
]}
]},
{ name: 'Hamster', childs: [
{ name: 'Elephant', childs: [
{ name: 'Fish' }
]},
{ name: 'Dog', childs: [
{ name: 'Fish' }
]}
]},
{ name: 'Dog', childs: [
{ name: 'Unicorn' },
{ name: 'Fish', childs: [
{ name: 'Hamster' },
{ name: 'Unicorn', childs: [
{ name: 'Elephant' }
]},
]}
]},
{ name: 'Elephant', childs: [
{ name: 'Duck' },
{ name: 'Hamster', childs: [
{ name: 'Elephant' },
{ name: 'Fish' },
]}
]}
],
Попытка изменить дерево из решения Нева (результат вывода в исходном формате объекта дерева, установить свойство для display = false, чтобы скрыть узел, продолжить поиск другого узла на том же уровне, даже если найден соответствующий узел). Это похоже на DFS, однако я все еще трачу много времени, чтобы разобраться в возврате. Окончательный результат - вернуть дерево, которое содержит только совпадающий результат и его родителя / предка.
searchHelper(term, children, showParent) {
let found;
if (showParent == null || showParent == undefined) {
showParent = false;
}
children.forEach(child => {
if (found = this.search(term, child)){
console.log('found--------------------------------');
child.display = true;
} else {
console.log('not foond-----------------------------------------')
child.display = false;
}
showParent = showParent || found;
})
return showParent;
}
search(term, parent) {
let ans, showParent, found, { name, children } = parent;
if (children.length) {
showParent = this.searchHelper(term, children, showParent);
}
return name.toLowerCase().indexOf(term.toLowerCase()) != -1;
}
this.search("Elephant", this.tree);