Сравните и введите правильное значение в массив объектов в JavaScript / TypeScript - PullRequest
0 голосов
/ 17 октября 2018

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

  1. Сравнение двух массивов объектов

  2. Сравнение двух массивов до нажатия

У меня есть два объекта массива, которые выглядят как

UsersList = [
0:{groupId: 'g1', userId: 'u1', userName: 'name1' }
1:{groupId: 'g1', userId: 'u2', userName: 'name2' }
2:{groupId: 'g1', userId: 'u3', userName: 'name3' }
3:{groupId: 'g1', userId: 'u4', userName: 'name4' }
4:{groupId: 'g2', userId: 'u2', userName: 'name2' }
5:{groupId: 'g2', userId: 'u5', userName: 'name5' }
6:{groupId: 'g2', userId: 'u6', userName: 'name6' }
7:{groupId: 'g2', userId: 'u7', userName: 'name7' }
8:{groupId: 'g2', userId: 'u8', userName: 'name8' }
]

userRoles = [
0:{groupId: 'g1', userId: 'u2', roles: 'admin' }
1:{groupId: 'g1', userId: 'u4', roles: 'admin' }
2:{groupId: 'g2', userId: 'u7', roles: 'user' }
3:{groupId: 'g2', userId: 'u5', roles: 'admin' }
4:{groupId: 'g2', userId: 'u2', roles: 'user' }
5:{groupId: 'g2', userId: 'u8', roles: 'admin' }
6:{groupId: 'g2', userId: 'u6', roles: 'admin' }
7:{groupId: 'g2', userId: 'u9', roles: 'admin' }
]

Я должен обнаружить, что userId и groupId из userRoles принадлежат userList или нет.Таким образом, я использовал приведенный ниже метод фильтрации

const result = this._usersList.filter(e =>
  this._usersRoles.some(r => e.groupId === r.groupId && e.userID === r.userID  ) );

, описанный выше: фильтрация двух моих объектов и предоставление мне одного result объекта.Что-то вроде этого.

result = [
0:{groupId: 'g1', userId: 'u2', userName: 'name2' }
1:{groupId: 'g1', userId: 'u4', userName: 'name4' }
2:{groupId: 'g2', userId: 'u7', userName: 'name7' }
3:{groupId: 'g2', userId: 'u6', userName: 'name5' }
4:{groupId: 'g2', userId: 'u2', userName: 'name2' }
5:{groupId: 'g2', userId: 'u8', userName: 'name8' }
6:{groupId: 'g2', userId: 'u5', userName: 'name5' }
]

Я нашел роли отдельных пользователей.Теперь я должен назначить роли для соответствующих пользователей в объекте userList = [].Если какой-либо конкретный пользователь не имеет роли, тогда свойство роли должно быть нулевым.

Так что я попытался использовать приведенный ниже код

if (result) {
  this._usersList.map(e => e['roles'] = this._usersRoles.map(r => r.userRoles) );
}

К сожалению, моя первая проблема началась здесь.Потому что result всегда имеет значение true и отображает список ролей массива и назначает объекту usersList все роли из моего объекта userRoles.Примерно так

UsersList = [
0:{groupId: 'g1', userId: 'u1', userName: 'name1', roles:['admin','admin','user','admin','user','admin','admin','admin'] }
1:{groupId: 'g1', userId: 'u2', userName: 'name2'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
2:{groupId: 'g1', userId: 'u3', userName: 'name3'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
3:{groupId: 'g1', userId: 'u4', userName: 'name4'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
4:{groupId: 'g2', userId: 'u2', userName: 'name2'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
5:{groupId: 'g2', userId: 'u5', userName: 'name5'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
6:{groupId: 'g2', userId: 'u6', userName: 'name6'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
7:{groupId: 'g2', userId: 'u7', userName: 'name7'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
8:{groupId: 'g2', userId: 'u8', userName: 'name8'  roles:['admin','admin','user','admin','user','admin','admin','admin'] }
]

Но мой результат должен выглядеть так

 finalUsersList = [
    0:{groupId: 'g1', userId: 'u1', userName: 'name1', roles: null }
    1:{groupId: 'g1', userId: 'u2', userName: 'name2', roles: 'admin' }
    2:{groupId: 'g1', userId: 'u3', userName: 'name3', roles: null }
    3:{groupId: 'g1', userId: 'u4', userName: 'name4', roles: 'admin' }
    4:{groupId: 'g2', userId: 'u2', userName: 'name2', roles: 'user' }
    5:{groupId: 'g2', userId: 'u5', userName: 'name5', roles: 'admin' }
    6:{groupId: 'g2', userId: 'u6', userName: 'name6', roles: 'admin' }
    7:{groupId: 'g2', userId: 'u7', userName: 'name7', roles: 'user'}
    8:{groupId: 'g2', userId: 'u8', userName: 'name8', roles: 'admin' }
    ]

И моя вторая проблема.Предположим, я пользователь (u2), который принадлежит к двум группам (g1, g2)g1 я admin и в g2 user.Следовательно, я admin из g1. Я заберу всех users, которые принадлежат к g1 группе.Кроме того, я являюсь группой user из g2, поэтому я буду выбирать только тех пользователей, чьи роли только admin.Так что я сделал один метод тоже.

if(myLocalStorageUserID === this._finalUsersList.filter(e => e.userId) && this._finalUsersList['roles'] == 'admin' {
const filterGroupIDForAdmin = this._finalUsersList['groupID ']
}

Итак, теперь я получил группу фильтров, которая удовлетворяет двум условиям.Во-первых, принадлежу ли я к этой группе, а к другой - какова роль.

Итак, теперь я проделал один цикл в соответствии с идентификатором группы и попытался получить все имена пользователей, например:

for(let i=0; i<this.finalUserList.length; i++) {
if(this.finalUserList[i].groupId == filterGroupIDForAdmin ) {
const userListForWhoseRolesIsAdmin = []
userListForWhoseRolesIsAdmin.push(finalUserList[i].userName)
}
}

тогда я проверил другие группы.Какова моя роль в этой группе, если «пользователь», тогда я возьму groupID, а также и зациклю объект finalUserlist, а затем получу пользователей, роль которых только admin.Вот так.

if(myLocalStorageUserID === this._finalUsersList.filter(e => e.userId) && this._finalUsersList['roles'] == 'user' {
    const filterGroupIDForUser = this._finalUsersList['groupID ']
    }

Теперь я получил фильтр groupId для роли пользователя.А теперь я получу имя пользователя.Я использовал приведенный ниже код.

for(let i=0; i<this.finalUserList.length; i++) {
    if(this.finalUserList[i].groupId == filterGroupIDForUser ) {
    const userListForWhoseRolesIsUser = []
    userListForWhoseRolesIsUser.push(finalUserList[i].userName , finalUserList[i].roles )
    }
    for(let i = 0; i<this.userListForWhoseRolesIsUser.length; i++) {
    const filterUserNameList =  []
    if(this.userListForWhoseRolesIsUser[i].role === 'admin') {
    filterUserNameList.push(userListForWhoseRolesIsUser[i].userName)
    }
 }

Результат должен выглядеть примерно так:

finalUserName = [
    0:{groupId: 'g1', userId: 'u1', userName: 'name1', roles: null }
    1:{groupId: 'g1', userId: 'u2', userName: 'name2', roles: 'admin' }
    2:{groupId: 'g1', userId: 'u3', userName: 'name3', roles: null }
    3:{groupId: 'g1', userId: 'u4', userName: 'name4', roles: 'admin' }
    5:{groupId: 'g2', userId: 'u5', userName: 'name5', roles: 'admin' }
    6:{groupId: 'g2', userId: 'u6', userName: 'name6', roles: 'admin' }
    8:{groupId: 'g2', userId: 'u8', userName: 'name8', roles: 'admin' }
    ]

Это огромный, громоздкий стиль кодирования, который я создал и который совершенно не верен.Пожалуйста, помогите мне уменьшить сложность алгоритма и решить мою проблему.Спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете построить Map для всех ролей и сопоставить новые объекты с ролью roles.

function getUsers(user) {
    var groups = finalUsersList
            .filter(({ userId }) => user === userId)
            .reduce((r, { groupId, roles }) => (r[groupId] = roles, r), Object.create(null));

    return finalUsersList
        .filter(({ groupId, roles }) => 
            groups[groupId] === 'admin' ||
            groups[groupId] === 'user' && roles === 'admin'
        );
}

var usersList = [{ groupId: 'g1', userId: 'u1', userName: 'name1' }, { groupId: 'g1', userId: 'u2', userName: 'name2' }, { groupId: 'g1', userId: 'u3', userName: 'name3' }, { groupId: 'g1', userId: 'u4', userName: 'name4' }, { groupId: 'g2', userId: 'u2', userName: 'name2' }, { groupId: 'g2', userId: 'u5', userName: 'name5' }, { groupId: 'g2', userId: 'u6', userName: 'name6' }, { groupId: 'g2', userId: 'u7', userName: 'name7' }, { groupId: 'g2', userId: 'u8', userName: 'name8' }],
    userRoles = [{ groupId: 'g1', userId: 'u2', roles: 'admin' }, { groupId: 'g1', userId: 'u4', roles: 'admin' }, { groupId: 'g2', userId: 'u7', roles: 'user' }, { groupId: 'g2', userId: 'u5', roles: 'admin' }, { groupId: 'g2', userId: 'u2', roles: 'user' }, { groupId: 'g2', userId: 'u8', roles: 'admin' }, { groupId: 'g2', userId: 'u6', roles: 'admin' }, { groupId: 'g2', userId: 'u9', roles: 'admin' }],
    roles = userRoles.reduce(
        (m, { groupId, userId, roles }) => m.set([groupId, userId].join('|'), roles),
        new Map()
    ),
    finalUsersList = usersList.map(user => Object.assign(
        {},
        user,
        { roles: roles.get([user.groupId, user.userId].join('|')) || null }
    ));

console.log(finalUsersList);
console.log(getUsers('u2'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...