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

Как правильно составить массив с данными?

https://jsfiddle.net/o3402uze/

Есть у меня 2 модели с данными из которых нужно получить 3ю.

Модель с компонентами

const components = [
	{
		id: 1,
		name: 'Box1',
		type: 'Box',
		props: {},
		elements: [],
	},
	{
		id: 2,
		name: 'Box2',
		type: 'Box',
		props: {},
		elements: [],
	},
	{
		id: 3,
		name: 'Box3',
		type: 'Box',
		props: {},
		elements: [],
	},
	{
		id: 4,
		name: 'Box4',
		type: 'Box',
		props: {},
		elements: [],
	},
	{
		id: 5,
		name: 'Box5',
		type: 'Box',
		props: {},
		elements: [],
	},
]


Модель связей компонентов друг с другом

В этой модели указаны id компонентов и их вложенность друг в друга
const structure = [
	{
		id: 1,
		children: [
			2,
			3,
		],
	},
	{
		id: 2,
		children: [
			4,
		],
	},
	{
		id: 3,
		children: [
			5,
		],
	},
	{
		id: 4,
		children: [],
	},
	{
		id: 5,
		children: [],
	},
]


Нужно получить следующую модель данных:

[
	{
		id: 1,
		name: 'Box1',
		type: 'Box',
		props: {},
		elements: [
			{
				id: 2,
				name: 'Box2',
				type: 'Box',
				props: {},
				elements: [
					{
						id: 4,
						name: 'Box4',
						type: 'Box',
						props: {},
						elements: [],
					},
				],
			},
			{
				id: 3,
				name: 'Box3',
				type: 'Box',
				props: {},
				elements: [
					{
						id: 5,
						name: 'Box5',
						type: 'Box',
						props: {},
						elements: [],
					},
				],
			},
		],
	},
]



Подумал, как получить такую модель?
Начальная идея была такой:
const getComponentById = id => components.find(item => item.id === id)

// Просто проходимся по связям и на основе связи добавляем компонент
const model = structure.map(item => {
	return {
		...getComponentById(item.id),
	}
})

Но, как же мне вложить их друг в друга, ведь связи по сути могут быть настолько глубоко. Подумал, наверное нужна рекурсия, но чёт не додумался как это применить.
  • Вопрос задан
  • 225 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function createTree(arr, structure) {
  const tree = Object.fromEntries(arr.map(n => [ n.id, { ...n } ]));
  const nonRootIds = structure.flatMap(n => n.children);

  structure.forEach(n => tree[n.id].elements = n.children.map(m => tree[m]));

  return Object.values(tree).filter(n => !nonRootIds.includes(n.id));
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
function factory(arr) {
  return arr.map(context => {
    if (typeof context === 'number') {
      context = {
        id: context,
        children: []
      }
    }

    const component = getComponentById(context.id)
    component.elements = factory(context.children)

    return component
  })
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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