Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сформировать один массив роль\права из 3х (https://javascript.ru/forum/dom-window/79936-sformirovat-odin-massiv-rol%5Cprava-iz-3kh.html)

Nexus 09.04.2020 13:32

(() => {
    
    const roleRight = [
        {
            "Id": 1,
            "RoleId": 1,
            "RightId": 1
        },
        {
            "Id": 2,
            "RoleId": 1,
            "RightId": 2
        },
        {
            "Id": 3,
            "RoleId": 2,
            "RightId": 2
        },
        {
            "Id": 4,
            "RoleId": 3,
            "RightId": 1
        },
    ];

    const roles = [
        {
            "Id": 1,
            "Name": "Администратор",
        },
        {
            "Id": 2,
            "Name": "Модератор",
        },
        {
            "Id": 3,
            "Name": "Пользователь",
        },
    ];

    const rights = [
        {
            "Id": 1,
            "Name": "Контакты - Просмотр",
        },
        {
            "Id": 2,
            "Name": "Контакты - Редактирование",
        }
    ];

    const usersRoles = (() => {
        const dictionaries = {
            roles,
            rights
        };
        
        const dictionariesIndexed = Object.keys(dictionaries).reduce((res, key) => {
            res[key] = {};
            
            dictionaries[key].forEach(item => {
                res[key][item.Id] = item;
            });
            
            return res;
        }, {});
        
        const result = roleRight.reduce((res, item) => {
            res[item.RoleId] = {
                Id: item.RoleId,
                Name: dictionariesIndexed.roles[item.RoleId].Name,
                Rights: []
            };
            
            return res;
        }, {});
        
        roleRight.forEach(item => {
            const roleId = item.RoleId;
            const rightId = item.RightId;
            
            result[item.RoleId].Rights.push({
                Id: item.RightId,
                Name: dictionariesIndexed.rights[item.RightId].Name
            });
        });
        
        return Object.values(result);
    })();

    console.log(usersRoles);
    
})();

Nexus 09.04.2020 13:35

У вас данные в базе хранятся "не традиционным" способом.
Загуглите «database relationship types»


Я ошибся, это many2many со сводной таблицей roleRight.
Значения хранятся в 4-й таблице?

По-моему это несколько неудобно.

destus 09.04.2020 13:35

jabbascript,
const roleRight = [
  {
    Id: 1,
    RoleId: 1,
    RightId: 1
  },
  {
    Id: 2,
    RoleId: 1,
    RightId: 2
  },
  {
    Id: 3,
    RoleId: 2,
    RightId: 2
  },
  {
    Id: 4,
    RoleId: 3,
    RightId: 1
  }
];

const roles = [
  {
    Id: 1,
    Name: "Администратор"
  },
  {
    Id: 2,
    Name: "Модератор"
  },
  {
    Id: 3,
    Name: "Пользователь"
  }
];

const rights = [
  {
    Id: 1,
    Name: "Контакты - Просмотр"
  },
  {
    Id: 2,
    Name: "Контакты - Редактирование"
  }
];

console.log(
  roles.map(role => {
    return {
      ...role,
      right: roleRight
        .filter(item => item.RoleId === role.Id)
        .map(item => rights.find(right => right.Id === item.RightId))
    };
  })
);

laimas 09.04.2020 14:01

Nexus,
если roleRight описывает совокупность прав, то все нормально. Я только никак не могу понять - для кого это получается?

Nexus 09.04.2020 14:07

https://jsben.ch/rrIQq Обидно.

Мой код производительнее на большем кол-ве данных.
https://jsben.ch/T9HgF

Nexus 09.04.2020 14:15

Цитата:

Сообщение от laimas
если roleRight описывает совокупность прав, то все нормально.

Список "ролей" и их "прав" без значения "права" не имеет смысла.
А с такой структурой таблиц это будет выглядеть, как прибитый сбоку костыль.
Я это имел ввиду.

Там либо делать связь к таблице role_right, либо придется делать таблицу role_right_value с полями:
- id
- role_id
- right_id
- value

laimas 09.04.2020 14:28

Я не об этом, я о 4-х таблицах - если первая пользователи, вторая роли, третья права, то четвертая вполне может описывать совокупность прав. А вот тут, это что-то непонятное - чего тут получаем?

А вообще, права лучше хранить как битовый набор, это упрощает проверку доступа.


Часовой пояс GMT +3, время: 20:17.