Ниже два вопроса выглядят похожими, но не имеют отношения к моему алгоритму.Потому что проблема, с которой я столкнулся, довольно сложна.И ни одно из решений не могло помочь мне.Так что мне пришлось написать длинный описательный вопрос, чтобы найти наставников.
Сравнение двух массивов объектов
Сравнение двух массивов до нажатия
У меня есть два объекта массива, которые выглядят как
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' }
]
Это огромный, громоздкий стиль кодирования, который я создал и который совершенно не верен.Пожалуйста, помогите мне уменьшить сложность алгоритма и решить мою проблему.Спасибо