У меня есть древовидная структура данных с дочерними элементами:
{ id: 1,
name: "Dog",
parent_id: null,
children: [
{
id: 2,
name: "Food",
parent_id: 1,
children: []
},
{
id: 3,
name: "Water",
parent_id: 1,
children: [
{
id: 4,
name: "Bowl",
parent_id: 3,
children: []
},
{
id: 5,
name: "Oxygen",
parent_id: 3,
children: []
},
{
id: 6,
name: "Hydrogen",
parent_id: 3,
children: []
}
]
}
]
}
У любого дочернего объекта данных может быть больше дочерних объектов, как показано в приведенных выше данных.Это представляет собой структуру DOM, из которой пользователь может выбрать элемент, к которому нужно добавить дочерний элемент.
У меня есть известный текстовый заголовок выбранного элемента из DOM, а также данные, которые пользователь хочет вставить.У меня возникли проблемы с поиском рекурсивного алгоритма, который позволил бы мне добавить новые данные на правильный уровень дерева.
Вот мой список, который продумывает проблему и пытается псевдокодировать ее:
входные данные:
- дерево (данные сверху)
- parentTitle от выбранного элемента в DOM
выходные данные:
- дерево со вставленным элементом
шаги:
- определить максимальный используемый идентификатор, чтобы узнать, каким будет следующий уникальный идентификатор
- проверить текущий уровень данных длясовпадать с заголовком родителя
- , если совпадает, затем установить id и parent_id в новых данных и вставить в потомки родителя
- , если совпадения нет, тогда проверить, имеют ли данные текущего уровня дочерние элементы
- если у текущего уровня есть дети, необходимо повторять шаги 2+ для каждого, пока не будет найдено совпадение
Вот мой код:
function askUserForNewItem(e) {
const tree = getTree(); // returns above tree data structure
const name = prompt( 'Enter new item’s name:' ); // user input to match and insert as new item in tree
const clickedTitle = getClickedTitle(e); // returns string title of clicked on item from DOM - for example "Dog" or "Bowl"
const parent = determineParent(tree, clickedTitle);
const parent_id = parent[0].id;
// TODO - needs to set real unique id (highest unused id)
const newId = 101; // hard coded for now, needs to be dynamic
// TODO - needs to insert into correct level of children array in tree
return tree.children.push({ id: newId, name, emoji, children: [], parent_id: parent_id });
}
function determineParent(tree, clickedTitle) {
if(tree.children.length === 0) {
return false;
}
let treeLevel = tree;
let parent = [];
while(treeLevel.children.length !== 0) {
parent = treeLevel.children.filter(child => child.name === clickedTitle);
if(parent.length !== 0) {
break;
}
else {
// what to do here to make this recursive?
}
}
return parent;
}
Так что, если пользователь набрал "Cat", в то время какнажав кнопку «Добавить» для «Собаки», затем новый объект
{
id: 7,
name: "Cat",
parent_id: 1,
children: []
}
Будет бВставляется в дочерние объекты первого уровня «Собака» в дереве данных.