Найти родительский элемент массива по id его дочернего элемента

Рейтинг: 0Ответов: 1Опубликовано: 11.08.2023

У меня есть JS-массив, имеющий следующий вид:

const arr = [
    {
        i: "tooltip_119",
        children: [
            {
                i: "text_345",
                children: []
            },
            {
                i: "wraper_375",
                children: [
                    {
                        i: "grid_15",
                        children: []
                    }
                ]             
            }
        ]
    },
    {
        i: "chart_123",
        children: []
    },
    {
        i: "graph_467",
        children: []
    },
]

Идея заключается в том, что у такого массива количество вложенностей потенциально может быть бесконечным. И мне нужна функция, которая, принимая параметр i какого-либо элемента, вернет параметр i его родителя (или 0, если элемент находится в корне и родителей не имеет). Пример работы такой функции:

console.log(findParent(arr, "grid_15"))  // returns "wraper_375"

Я написал такую функцию:

export function findParent(arr, i) {   // this func has a bug on deep levels
  for (let j = 0; j < arr.length; j++) {
    const element = arr[j];
    if (element.children && element.children.length > 0) {
      const childElement = element.children.find((e) => e.i === i);
      if (childElement) {
        return element.i;
      } else {
        const parentElement = findParent(element.children, i);
        if (parentElement) {
          return parentElement.i;
        }
      }
    }
  }
  return 0;
}

Проблема в том, что моя функция не работает на более глубоких уровнях вложенности. Буду благодарен за помощь

Ответы

▲ 1Принят

Найти родительский элемент массива по id его дочернего элемента

Предложу вот такой вариант с рекурсией...

const arr = [
    {
        i: "tooltip_119",
        children: [
            {
                i: "text_345",
                children: []
            },
            {
                i: "wraper_375",
                children: [
                    {
                        i: "grid_15",
                        children: []
                    }
                ]             
            }
        ]
    },
    {
        i: "chart_123",
        children: []
    },
    {
        i: "graph_467",
        children: []
    },
]
console.log(findParent(arr, "grid_15"))  // returns "wraper_375"
//
function findParent(arr, i) {
  for (let j = 0; j < arr.length; j++) {
    if(arr[j].children.find(o => o.i === i)) return arr[j].i
    const v = findParent(arr[j].children, i)
    if (v) return v
  }
  return null
}