Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 09.04.2020, 13:32
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

(() => {
    
    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);
    
})();
Ответить с цитированием
  #12 (permalink)  
Старый 09.04.2020, 13:35
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

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


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

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

Последний раз редактировалось Nexus, 09.04.2020 в 13:38.
Ответить с цитированием
  #13 (permalink)  
Старый 09.04.2020, 13:35
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

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))
    };
  })
);
Ответить с цитированием
  #14 (permalink)  
Старый 09.04.2020, 14:01
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Nexus,
если roleRight описывает совокупность прав, то все нормально. Я только никак не могу понять - для кого это получается?
Ответить с цитированием
  #15 (permalink)  
Старый 09.04.2020, 14:07
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

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

Мой код производительнее на большем кол-ве данных.
https://jsben.ch/T9HgF
Ответить с цитированием
  #16 (permalink)  
Старый 09.04.2020, 14:15
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

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

Там либо делать связь к таблице role_right, либо придется делать таблицу role_right_value с полями:
- id
- role_id
- right_id
- value
Ответить с цитированием
  #17 (permalink)  
Старый 09.04.2020, 14:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Набор, массив, slideToggle miRrage jQuery 4 24.09.2017 17:18
Пустой массив при сохранении в localStorage kichkun Общие вопросы Javascript 1 19.11.2016 13:58
Чтение данных из файла в массив TheSingleElk Общие вопросы Javascript 2 16.06.2016 01:09
Сформировать массив данных и отправить его в PHP средствами JS westnord Общие вопросы Javascript 21 16.07.2013 12:18
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14