У меня есть плоский массив объектов, который мне нужен в (глубоко) вложенном массиве объектов.
Мой плоский массив (идентификаторы случайны в реальности, но здесь для ясности изменен, и вложение может быть очень глубокий):
const tags = [
{
id: 'tag1',
title: 'Tag 1',
childIds: ['tag11', 'tag12'],
root: true
},
{
id: 'tag11',
title: 'Tag 11',
childIds: ['tag111', 'tag112'],
},
{
id: 'tag12',
title: 'Tag 12',
childIds: ['tag121']
},
{
id: 'tag111',
title: 'Tag 111',
childIds: []
},
{
id: 'tag112',
title: 'Tag 112',
childIds: []
},
{
id: 'tag121',
title: 'Tag 121',
childIds: []
}
]
Мой желаемый вывод:
tagsNested = [
{
id: 'tag1',
title: 'Tag 1',
tags: [
{
id: 'tag11',
title: 'tag 11',
tags: [
{
id: 'tag111',
title: 'Tag 111',
tags: []
},
{
id: 'tag112',
title: 'Tag 112',
tags: []
}
]
},
{
id: 'tag12',
title: 'tag 12',
tags: [
{
id: 'tag121',
title: 'Tag 121',
tags: []
}
]
}
]
}
]
Пока что я стараюсь вкладывать все теги в любой тег.
Т.е. я делаю получить вложенный массив, но каждый тег-массив содержит все теги .
function unflatten(tag, nestedTags) {
if (tag.childIds) {
tag.childIds.forEach((childId) => {
var childTag = tags.find((t) => t.id === childId)
childTag.tags = unflatten(childTag, nestedTags)
nestedTags.push(childTag)
})
}
return nestedTags
}
const rootTag = tags.find((tag) => tag.root)
console.log(unflatten(rootTag, []))
Я действительно борюсь с этими рекурсивными функциями и выясняю, как сделать так, чтобы операторы return дали мне правильные данные.