JSFiddle - React, Tailwind, and code Playground
by AngReload
HTML
<pre id="text"></pre>
CSS
#text {
font-family: "SF Mono","Monaco","Andale Mono","Lucida Console","Bitstream Vera Sans Mono","Courier New",Courier,monospace;
font-size: 13px;
}
JavaScript
items = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4, children: [{ id: 6 }, { id: 7, children: [{ id: 8 }, { id: 9 }] }] }, { id: 5 }];
let needle = items[3].children[0];
// фйункция принимает некий узел
function findParentOf(node) {
function f(acc, el) {
// если на предыдущих шагах уже был найден ответ, то вернём его
if(acc) return acc
// если у объекта есть массив потомков && любой из его потомков равен node
// значит родитель найден, возвращаем его как результат
if(el.children && el.children.some(child => child === node)) return el
// в ином случае проведём такой же поиск среди потомков объекта
if(el.children) return el.children.reduce(f, acc)
// в случае, если у этого объекта и его потомков не найдено подходящего
// тогда передадим null в дальнейший поиск
return acc
}
// запускаем рекурсивный поиск здесь
return items.reduce(f, null);
}
let result = findParentOf(needle);
document.getElementById('text').innerHTML =
JSON.stringify(result, null, 2) + '\n\nparent of\n\n' + JSON.stringify(needle, null, 2)