Функция, превращающая плоский массив в дерево:
function createTree({
data,
key = 'id',
parentKey = 'parentId',
childrenKey = 'children',
}) {
const tree = Object.fromEntries(data.map(n => [
n[key],
{ ...n, [childrenKey]: [] },
]));
return Object.values(tree).filter(n => (
!tree[n[parentKey]]?.[childrenKey].push(n)
));
}
Рекурсивный компонент
v-tree, выводящий древовидные данные:
props: {
items: {
type: Array,
default: () => [],
},
maxdepth: {
type: Number,
default: Infinity,
},
},
<ul v-if="Array.isArray(items) && items.length && maxdepth > 0">
<li v-for="n in items" :key="n.id">
{{ n.value }}
<v-tree :items="n.children" :maxdepth="maxdepth - 1" />
</li>
</ul>
Как использовать:
data: () => ({
treeData: createTree({
data: flatData,
parentKey: 'parent_id',
}),
}),
// или
computed: {
treeData() {
return createTree({
data: this.flatData,
parentKey: 'parent_id',
});
},
},
<v-tree
:items="treeData"
:maxdepth="3"
/>
Демо.