@claus_bor

Как достать нужное свойство из многомерного объекта?

Есть объект:
const obj = {
  id: 1,
  parentId: 0,
  childGroups: [
    {
      id: 2,
      parentId: 1,
    },
    {
      id: 3,
      parentId: 1,
      childGroups: [
        {
          id: 6,
          parentId: 3,
        },
        {
          id: 7,
          parentId: 3,
        },
      ]
    },
    {
      id: 4,
      parentId: 1,
    },
    {
      id: 5,
      parentId: 1,
    },
  ]
}


Как мне получить объект по свойству id из этого объекта?
К примеру мне нужен объект с id 6, он может быть в любом месте, с любой вложенностью, как мне достать этот объект?
  • Вопрос задан
  • 195 просмотров
Решения вопроса 2
function doSmth(obj) {
  console.log(obj.id)
}

function isRightObj(obj) {
  return obj.id === 6
}

function reqursive(obj) {
  if ( isRightObj(obj) ) {
    doSmth(obj)
  }
  const childs = obj.childGroups
  if (childs && Array.isArray(childs)) {
    childs.forEach(reqursive)
  }
}
reqursive(obj)
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
function getById( obj, id) {
  var i, found;
  if( obj.id === id) return obj;
  if( obj.hasOwnProperty('childGroups')) {
    for( i in obj.childGroups) {
      if( found = getById( obj.childGroups[i], id)) return found;
    }
  }
  return;
}

getById( obj,3) // {"id":3,"parentId":1,"childGroups":[{"id":6,"parentId":3},{"id":7,"parentId":3}]}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@coderlex
Написать рекурсивную функцию для прохода по всем веткам дерева - самый простой способ.
Ответ написан
Комментировать
hahenty
@hahenty
('•')
Можно сделать дополнительный массив, где индексом будут айди объектов, а значением – прямая ссылка на объект в дереве. То есть "плоский" дубликат дерева.
Естественно, что потребуется дополнительный контроль за этим массивом, и то, перемещение объекта по дереву не изменит ссылку в массиве.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы