Сформировать один массив роль\права из 3х
Здравствуйте!!!
Подскажите как можно сформировать из данных массивов полученных с апи: 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": "Контакты - Редактирование", } ]; Пимерно такой т е основываясь на roleRights сформировать массив обьестов где содержится Роль и ее права. const roles = [ { "Id": 1, "Name": "Администратор", "right": [ { "Id": 1, "Name": "Контакты - Просмотр", }, { "Id": 2, "Name": "Контакты - Редактирование", } ] }, { "Id": 2, "Name": "Модератор", "right": [ { "Id": 1, "Name": "Контакты - Просмотр", }, { "Id": 2, "Name": "Контакты - Редактирование", } ] }, ]; |
jabbascript,
непонятно как формируется массив прав ... |
рони,
наверное так - roles[i][RoleId], соответственно и права по RightId |
Цитата:
|
рони,
roles[index][Id] == roleRight[index][RoleId] = "Администратор", ... Соответственно и права но уже по равенству RightId и Id из rights. Видимо так. Как только проверять такие права, не представляю. |
laimas,
:-? нет массива индексов прав, нет массива правил либо здесь "RightId": 1 массив либо тут немассив "right": [] |
Вообще, нужно не const roles модифицировать (да и не получится), а обходить первичный объект, а это const roleRight, вот это более всего отвечает первичной таблице в базе - юзеры. А roles и rights, это связанные таблицы описывающие роли и их права.
И все будет связываться, иначе нет логики. |
рони, надо конечно автора заставить высказаться, но по идее так должно быть:
Код:
users |
Это правильная структура. Тут 1на таблица содержит идишники роли и права.
{ "Id": 1, "RoleId": 1, роль с ид 1 "RightId": 1 право с ид 2 } Какбы у меня Odata и есть три урла /RoleRight /Role /Rights. |
По представленным данным их никак не связать в то, что именно вы хотите получить.
|
(() => { 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); })(); |
Загуглите «database relationship types» Я ошибся, это many2many со сводной таблицей roleRight. Значения хранятся в 4-й таблице? По-моему это несколько неудобно. |
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)) }; }) ); |
Nexus,
если roleRight описывает совокупность прав, то все нормально. Я только никак не могу понять - для кого это получается? |
https://jsben.ch/rrIQq Обидно.
Мой код производительнее на большем кол-ве данных. https://jsben.ch/T9HgF |
Цитата:
А с такой структурой таблиц это будет выглядеть, как прибитый сбоку костыль. Я это имел ввиду. Там либо делать связь к таблице role_right, либо придется делать таблицу role_right_value с полями: - id - role_id - right_id - value |
Я не об этом, я о 4-х таблицах - если первая пользователи, вторая роли, третья права, то четвертая вполне может описывать совокупность прав. А вот тут, это что-то непонятное - чего тут получаем?
А вообще, права лучше хранить как битовый набор, это упрощает проверку доступа. |
Часовой пояс GMT +3, время: 06:49. |