Исключить пустой ассоциативный массив с помощью Sequelize

#mysql #node.js #express #sequelize.js #associations

#mysql #node.js #выразить #sequelize.js #ассоциации

Вопрос:

У меня есть таблица меню с самоассоциацией «один ко многим», так что в основном структура выглядит так

 ---Menu
    |
    '--submenu
    |
    '--submenu

---secondMenu
    |
    '--submenu
            |
            '--submenu
            |
            '--submenu
---thirdMenu

  

Рассмотрим третье меню, в котором нет никаких подменю. В этом случае я хочу, чтобы поле подменю было нулевым, или это поле не должно быть прикреплено. Я получаю результаты, подобные

 "menu": [
        {
            "name": "Settings",
            "id": 37,
            "slug": "Settings-ecom",
            "url": "/Settings",
            "submenu": [
                {
                    "name": "Settings-child1",
                    "id": 38,
                    "slug": "Settings-ecom-child1",
                    "url": "/Settings-child1",
                    "submenu": [
                        {
                            "name": "Settings-child1-child1",
                            "id": 40,
                            "slug": "Settings-ecom-child1-child1",
                            "url": "/Settings-child1-child1",
                            "submenu": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Dashboard",
            "id": 30,
            "slug": "dashboard-ecommerce",
            "url": "/dashboard",
            "submenu": []
        }
    ]
  

рассмотрим submenu=[] часть результата, что мне нужно, так это то, что при отсутствии подменю оно не должно возвращаться submenu = [] . либо оно должно исключать подменю, либо это должно быть что-то вроде submenu = null
ниже приведен мой запрос для получения меню

 const menu = await Menu.findAll({
                    where: {parent_id: null},
                    attributes: Constants.attributes,
                    include: [
                        {
                            model: Menu,
                            as: 'submenu',
                            attributes: Constants.attributes,
                            include: [
                                {
                                    model: Menu,
                                    as: 'submenu',
                                    attributes: Constants.attributes,
                                   
                                },
                            ],
                        },
                    ],
                });

  

и, наконец, ассоциация похожа

 menu.hasMany(models.menu, {
            as: 'submenu',
            foreignKey: 'parent_id',
            useJunctionTable: false,
         });
  

Спасибо, что просмотрели мой вопрос 🙂

Ответ №1:

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

  cleanMenusObject = async (menuToUpdate) => {

    for (const { dataValues } of menuToUpdate) {
        if (dataValues.submenu) {
           const { submenu } = dataValues;
           if (!submenu.length) {
              delete submenu;
              return;
           } else {
              await cleanMenusObject(submenu);
           }
        }
    }
};