Получить ближайший родительский объект во вложенном массиве

#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));