Я строю динамическое дерево меню, основанное на базе данных, поэтому я загружаю каждый элемент меню в пользовательском интерфейсе на его основе. У меня уже есть рекурсивный компонент для их загрузки. Основная проблема заключается в том, как правильно вложить данные:
У меня есть эта таблица
Menu(
id UUID
parent_id UUID
);
Запрос возвращает эти значения сглаженные
ID PARENT_ID (father id)
X Y
Y Z
Z X
G Y
Я пробовал это: Рекурсивная функция для генерации многомерного массива из результата базы данных . И это:
type Menu struct {
ID string
ParentID string
Children []Menu
}
func assignChildren(menuArr []Menu) {
for _, element := range menuArr {
recursive(element, "")
}
}
func recursive(element Menu, parentID string) {
var res
if element.ID == parentID {
return element
}
for _, children := range element.Children {
res = recursive(children, children.ID)
if res.ID != "" {
return res
}
}
return res
}
Но не удалось правильно его вложить.
Как это вложить?
Пример дерева меню:
Menu v
--Submenu ^
----Submenu v
------Subitem
------Subitem
----Subitem
----Subitem
--Submenu v
--Subitem
Menu ^
Это данные, возвращенные из запроса
map[
118fa1eb-c814-4776-9d75-4ea1d503e53f:
{{ false} { false} true true true true false [] {118fa1eb-c814-4776-9d75-4ea1d503e53f VT Passa Fácil business white black /vt-passa-facil /vt_passa_facil true true true { false} { false}}}
59ed8933-3ab6-4043-b948-147495fc9ca5:
{{ false} { false} true true true true false [] {59ed8933-3ab6-4043-b948-147495fc9ca5 Usuários business grey black /eucard/users /usuarios true true true {a6491db1-df1e-4e1d-84bb-68c3224048e1 true} { false}}}
87e9cd76-1c82-43d4-9724-a74d9fb0c95d:
{{ false} { false} true true true true false [] {87e9cd76-1c82-43d4-9724-a74d9fb0c95d Configurações business white black /settings /settings true true true { false} { false}}}
a6491db1-df1e-4e1d-84bb-68c3224048e1:
{{ false} { false} true true true true false [] {a6491db1-df1e-4e1d-84bb-68c3224048e1 Eucard business white black eucard /eucard true true true { false} { false}}}
b6d7adb4-ddbf-4bfc-9bc0-bcbb3b7bb480:
{{ false} { false} true true true true false [] {b6d7adb4-ddbf-4bfc-9bc0-bcbb3b7bb480 Clientes business grey black /eucard/customer /clientes true true true {59ed8933-3ab6-4043-b948-147495fc9ca5 true} { false}}}
e40bdec0-953d-455e-a523-21fd31b24590:
{{ false} { false} true true true true false [] {e40bdec0-953d-455e-a523-21fd31b24590 Teste person grey black /eucard/asd /teste true true true {b6d7adb4-ddbf-4bfc-9bc0-bcbb3b7bb480 true} { false}}}
]
Я пробовал также это, но оно никогда не вкладывалось правильно
func assignChildren(mapList []Menu) {
for _, elementInMap := range mapList {
for _, children := range mapList {
if elementInMap.ID == children.ParentID.String {
elementInMap.Children = append(elementInMap.Children, children)
}
}
}
}
В ответ на mkopriva:
(если прокомментировано, если)
{
"menu": [
{
"menu": [
{
"menu": [
{
"menu": null,
"name": "Teste"
}
],
"name": "Clientes"
}
],
"name": "Usuários"
},
{
"menu": [
{
"menu": [
{
"menu": [
{
"menu": null,
"name": "Teste"
}
],
"name": "Clientes"
}
],
"name": "Usuários"
}
],
"name": "Eucard"
},
{
"menu": [
{
"menu": null,
"name": "Teste"
}
],
"name": "Clientes"
},
{
"menu": null,
"name": "Configurações"
},
{
"menu": null,
"name": "VT Passa Fácil"
},
{
"menu": null,
"name": "Teste"
}
]
}
(если не прокомментировано)
{
"menu": [
{
"menu": [
{
"menu": null,
"name": "Usuários"
}
],
"name": "Eucard"
},
{
"menu": null,
"name": "Configurações"
},
{
"menu": null,
"name": "VT Passa Fácil"
}
]
}