Как найти первого предка в плоском массиве элементов рекурсивно?

Алгоритм поиска представляет из себя рекурсию, которая проверяет существует ли элемент, если существует то ищет дальше, если нет то возвращает результат.

const tasks = [
  { id: 1, parent: -1, value: 'Make breakfast' },
  { id: 2, parent: 1, value: 'Brew coffee' },
  { id: 3, parent: 2, value: 'Boil water' },
  { id: 4, parent: 3, value: 'Grind coffee beans' },
  { id: 5, parent: 4, value: 'Pour water over coffee grounds' }
];

function findNode (id) {
  return tasks.filter(function(item) {
    if (item.id === id) {
      return item
    }
  })[0]
}

function findParent (id) {
  const parent = findNode(id);
  if (typeof parent !== 'undefined') {
    findParent(parent.parent);
  } else {
    return id;
  }
}
console.log(findParent(4))

проблема заключается в том, что на условии typeof parent !== 'undefined' рекурсия срабатывает лишний раз, хотя parent является undefined


Ответы (1 шт):

Автор решения: Igor

Если Вам нужен первый (ближайший?) родитель, то зачем здесь рекурсия?


Ошибка в пропущеном return перед рекурсивным вызовом findParent(parent.parent);.

И findNode возвращает не parent, a item.

const tasks = [
  { id: 1, parent: -1, value: 'Make breakfast' },
  { id: 2, parent: 1, value: 'Brew coffee' },
  { id: 3, parent: 2, value: 'Boil water' },
  { id: 4, parent: 3, value: 'Grind coffee beans' },
  { id: 5, parent: 4, value: 'Pour water over coffee grounds' }
];

function findNode (id) {
  return tasks.filter(item => item.id === id)[0];
}

function findParent (id) {
  const node = findNode(id);
  if (typeof node !== 'undefined' && node.parent != -1) {
    return findParent(node.parent);
  }
  return id;
}
console.log(findParent(4))

→ Ссылка