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

Как вложить элементы массива друг в друга начиная с конца?

Добрый вечер, ребята))
Помогите решить задачку

https://jsfiddle.net/rxjvh1g0/2/

Дан массив, состоящий из объектов
const array = [
	{
		name: 'Заголовок 1',
		children: [],
	},
	{
		name: 'Заголовок 2',
		children: [],
	},
	{
		name: 'Заголовок 3',
		children: [],
	}
]

и объект
const obj = {
	name: 'Заголовок 4',
	children: [],
}


Нужно получить такой результат
{
	name: 'Заголовок 1',
	children: [
		{
			name: 'Заголовок 2',
			children: [
				{
					name: 'Заголовок 3',
					children: [
						{
							name: 'Заголовок 4',
							children: [],
						}
					]
				}
			]
		}
	]
}


В голову мне пришло лишь 1 решение, выглядит оно ужасно, но до другого я не додумался. Это циклом пройтись по элементам, но с конца, вкладывая друг в друга, но что-то я напартачил с получением следующего элемента и никак не пойму, как мне решить. Объект "заголовок 2" куда-то пропал. Подскажите пожалуйста и по возможности, подскажите, как лучше решить такую задачку
  • Вопрос задан
  • 141 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const result = array
  .concat(obj)
  .reduceRight((acc, n) => ({
    ...n,
    children: acc ? [ acc ] : [],
    // или, если вдруг исходные массивы непустые,
    // и их содержимое надо сохранить
    // children: n.children.concat(acc || []),
  }), null);

Непонятно только, зачем вложенные массивы из одного элемента? Можно класть в объект просто ссылку на следующий объект, получится обычный связный список:

const result = [ ...array, obj ].reduceRight(
  (acc, { children, ...n }) => (n.next = acc, n),
  null
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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