#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть следующий массив:
const items = [
{
"id": 1,
"name": "Menu 1",
"content": [
{
"id": 2,
"name": "Submenu 1 OF 1",
"url": "teste"
}
]
},
{
"id": 3,
"name": "Menu 2",
"content": [
{
"id": 4,
"name": "Submenu 1 OF 2",
"url": "teste"
},
{
"id": 5,
"name": "Submenu 2 OF 2",
"content": [
{
"id": 6,
"name": "Sub submenu 1 OF 2",
"url": "teste"
},
{
"id": 7,
"name": "Sub submenu 2 OF 2",
"url": "teste"
},
]
}
]
}
]
Мне нужна функция, которая с учетом идентификатора получает ближайший родительский объект. Например, если я дам id 2
ему возврат {"id: 1, "name": "Menu 1", "content": [...]}
. Если я дам id 6
ему возврат {"id": 5, "name": "Submenu 2 OF 2", content: [...]}
.
Я пробовал, но я могу получить только родительский объект верхнего уровня, а не ближайший.
РЕДАКТИРОВАТЬ: код, который я тестировал до сих пор:
let findDeep = function(data, id) {
return data.find(function(e) {
if(e.id == id) return e;
else if(e.content) return findDeep(e.content, id);
}
})
Комментарии:
1. Пожалуйста, покажите код того, что вы пробовали до сих пор.
2. Лучше, если вы можете использовать древовидную структуру
3. Я отредактировал код с тем, что я тестировал.
Ответ №1:
Вы можете использовать рекурсивный поиск в глубину:
function findParent(items, id, parent=null) {
for (let item of items) {
let res = item.id === id ? parent
: item.content amp;amp; findParent(item.content, id, item);
if (res) return res;
}
}
// demo: find parent of id=6 in example tree:
const items = [{"id": 1,"name": "Menu 1","content": [{"id": 2,"name": "Submenu 1 OF 1","url": "teste"}]},{"id": 3,"name": "Menu 2","content": [{"id": 4,"name": "Submenu 1 OF 2","url": "teste"},{"id": 5,"name": "Submenu 2 OF 2","content": [{"id": 6,"name": "Sub submenu 1 OF 2","url": "teste"},{"id": 7,"name": "Sub submenu 2 OF 2","url": "teste"},]}]}]
console.log(findParent(items, 6));
Ответ №2:
Вы можете сделать это с помощью рекурсивной функции, которая проверяет каждого дочернего объекта и возвращает родительский объект, если идентификатор совпадает:
const findParent = (id, obj) => {
for (const child of obj.content) {
if (child.id === id) return obj;
if (!child.content) continue;
const found = findParent(id, child);
if (found) return found;
}
return undefined;
}
const items = {content: [{
"id": 1,
"name": "Menu 1",
"content": [{
"id": 2,
"name": "Submenu 1 OF 1",
"url": "teste"
}]
},
{
"id": 3,
"name": "Menu 2",
"content": [{
"id": 4,
"name": "Submenu 1 OF 2",
"url": "teste"
},
{
"id": 5,
"name": "Submenu 2 OF 2",
"content": [{
"id": 6,
"name": "Sub submenu 1 OF 2",
"url": "teste"
},
{
"id": 7,
"name": "Sub submenu 2 OF 2",
"url": "teste"
},
]
}
]
}
]
}
console.log(findParent(2, items));
console.log(findParent(6, items));