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)