Как вложить * возможно * бесконечный рекурсивный массив? - PullRequest
0 голосов
/ 28 октября 2019

Я строю динамическое дерево меню, основанное на базе данных, поэтому я загружаю каждый элемент меню в пользовательском интерфейсе на его основе. У меня уже есть рекурсивный компонент для их загрузки. Основная проблема заключается в том, как правильно вложить данные:

У меня есть эта таблица

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"
        }
    ]
}
...