bootd
@bootd
Гугли и ты откроешь врата знаний!

Как получить всех родителя и родителей родителя?

Добрый вечер, сижу туплю, никак в голову не может придти решение.
Есть такая вот структура данных
Структура

[
	{ 
		"name": "Дирекция юкрк",
		"parentId": null,
		"structureId": 1
	},
	{ 
		"name": "Южно-Курильск",
		"parentId": 1,
		"structureId": 2
	},
	{ 
		"name": "Служба главного инженера",
		"parentId": 2,
		"structureId": 3
	},
	{ 
		"name": "Мехцех",
		"parentId": 3,
		"structureId": 4
	},
	{ 
		"name": "Стройтех",
		"parentId": 3,
		"structureId": 5
	},
	{ 
		"name": "Автослужба",
		"parentId": 3,
		"structureId": 6
	},
	{ 
		"name": "Рефслужба",
		"parentId": 3,
		"structureId": 7
	},
	{ 
		"name": "Энергослужба",
		"parentId": 3,
		"structureId": 8
	},
	{ 
		"name": "Отдел флота",
		"parentId": 2,
		"structureId": 9
	},
	{ 
		"name": "Погрузочно-разгрузочный",
		"parentId": 2,
		"structureId": 10
	},
	{ 
		"name": "Бухгалтерия",
		"parentId": 2,
		"structureId": 11
	},
	{ 
		"name": "Служба охраны",
		"parentId": 2,
		"structureId": 12
	},
	{ 
		"name": "Ахо (Южно-Курильск)",
		"parentId": 2,
		"structureId": 13
	},
	{ 
		"name": "ТБ",
		"parentId": 2,
		"structureId": 14
	},
	{ 
		"name": "Склад готовой продукции",
		"parentId": 2,
		"structureId": 15
	},
	{ 
		"name": "Склад материально-технический",
		"parentId": 2,
		"structureId": 16
	},
	{ 
		"name": "Рыборазводный завод",
		"parentId": 2,
		"structureId": 17
	},
	{ 
		"name": "Производственно-коммерческий отдел",
		"parentId": 1,
		"structureId": 18
	},
	{ 
		"name": "производство продукции",
		"parentId": 18,
		"structureId": 19
	},
	{ 
		"name": "береговой цех рыбопереработки",
		"parentId": 19,
		"structureId": 20
	},
	{ 
		"name": "браттег цех рыбопереработки",
		"parentId": 19,
		"structureId": 21
	},
	{ 
		"name": "вардхольмцех рыбопереработки",
		"parentId": 19,
		"structureId": 22
	},
	{ 
		"name": "Южно-сахалинск",
		"parentId": 1,
		"structureId": 23
	},
	{ 
		"name": "финансовая служба",
		"parentId": 23,
		"structureId": 24
	},
	{ 
		"name": "отдел снабжения и закупок",
		"parentId": 23,
		"structureId": 25
	},
	{ 
		"name": "ахо ( южно -сахалинск)",
		"parentId": 23,
		"structureId": 26
	},
	{ 
		"name": "бухгалтерия",
		"parentId": 23,
		"structureId": 27
	},
	{ 
		"name": "юридический отдел",
		"parentId": 23,
		"structureId": 28
	},
	{ 
		"name": "it отдел",
		"parentId": 23,
		"structureId": 29
	},
	{ 
		"name": "Отдел кадров Южно-Сахалинска",
		"parentId": 1,
		"structureId": 30
	},
	{ 
		"name": "Служба эксплуатации флота",
		"parentId": 1,
		"structureId": 31
	},
	{ 
		"name": "механико-судовая служба",
		"parentId": 31,
		"structureId": 32
	},
	{ 
		"name": "Флот",
		"parentId": 31,
		"structureId": 33
	},
	{ 
		"name": "СртМ «браттег»",
		"parentId": 33,
		"structureId": 34
	},
	{ 
		"name": "СртМ «бардхольм»",
		"parentId": 33,
		"structureId": 35
	},
	{ 
		"name": "Ст «асбьерн»",
		"parentId": 33,
		"structureId": 36
	},
	{ 
		"name": "ртм «диктис»",
		"parentId": 33,
		"structureId": 37
	},
	{ 
		"name": "ртм «грей»",
		"parentId": 33,
		"structureId": 38
	},
	{ 
		"name": "мдс «кай»",
		"parentId": 33,
		"structureId": 39
	},
	{ 
		"name": "рш «матуа»",
		"parentId": 33,
		"structureId": 40
	},
	{ 
		"name": "бк «удачный»",
		"parentId": 33,
		"structureId": 41
	},
	{ 
		"name": "рш «дай 23 ниссе мару»",
		"parentId": 33,
		"structureId": 42
	},
	{ 
		"name": "рш «палтусово»",
		"parentId": 33,
		"structureId": 43
	},
	{ 
		"name": "рш «тайе мару 53»",
		"parentId": 33,
		"structureId": 44
	},
	{ 
		"name": "рш «шое мару 53»",
		"parentId": 33,
		"structureId": 45
	},
	{ 
		"name": "тр «ос рифер»",
		"parentId": 33,
		"structureId": 46
	},
	{ 
		"name": "тхс «тхс свирица»",
		"parentId": 33,
		"structureId": 47
	},
	{ 
		"name": "Служба безопасности",
		"parentId": 1,
		"structureId": 48
	}
]



Я строю древовидную структуру данных на d3.js. Всё хорошо работает, я легко могу по id найти всех детей и построить дерево. Но в дополнение к задаче, нужно, выбирая определённый элемент, помимо его детей, ещё указать его родителей и построить дерево. Уже несколько часов бадаюсь, но чёт никак не могу придумать решение.

Подскажите, как подобное решить.
  • Вопрос задан
  • 311 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
const getById = id => data.filter(s => s.structureId === id)[0] || false;
const getChild = me => data.filter(s => s.parentId === me.structureId)[0] || false;
const getMyParent = me => getById(me.parentId);

const getParentsChain = me => {
  const chain = [];
  let parent = getMyParent(me);
  while(parent) {
    chain.unshift(parent);
    parent = getMyParent(parent);
  }
  return chain;
}

const getChildrenChain = me => {
  const chain = [];
  let child = getChild(me);
  while(child) {
  	chain.push(child);
    child = getChild(child);
  }
  return chain;
}

// test
const me = getById(3);
console.log([...getParentsChain(me), me, ...getChildrenChain(me)]); /*
0: Object { name: "Дирекция юкрк", parentId: null, structureId: 1 }
​1: Object { name: "Южно-Курильск", parentId: 1, structureId: 2 }
​2: Object { name: "Служба главного инженера", parentId: 2, structureId: 3 }
​3: Object { name: "Мехцех", parentId: 3, structureId: 4 } */
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
function convertToTree (elems, idField, parentIdField) {
    const tree = []
    const elemsMap = {}

    elems.forEach(item => { 
      elemsMap[item[idField]] = {
        ...item, 
        parent: null, 
        children: [] 
      } 
    })

    for(let id in elemsMap) {
      const item = elemsMap[id]
      if (!item[parentIdField]) {
        tree.push(item)
      } else {
        const parent = elemsMap[item[parentIdField]]
        parent.children.push(item)
        item.parent = parent
      }
    }
    
    return tree
  }

const tree = convertToTree(yourArray, 'structureId', 'parentId')
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Rocket Брянск
от 60 000 до 100 000 ₽