Фильтровать массив пользовательских объектов по массиву ролей в Javascript - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть массив пользовательских объектов. Я хочу отфильтровать их по массиву пользовательских ролей.

filter = ['ROLE_SELLER', 'ROLE_BANK', 'ROLE_CPF', 'ROLE_SLA', 'ROLE_LDAU']

const users = [{
		"id": 1,
		"email": "user1@test.com",
		"name": "User1",
		"roles": [{
				"id": 1,
				"code": "ROLE_ADMINISTRATOR",
				"name": "Administrator"
			},
			{
				"id": 2,
				"code": "ROLE_SELLER",
				"name": "Seller"

			}
		]
	}, {
		"id": 2,
		"email": "user2@test.com",
		"name": "User2",
		"roles": [{
			"id": 1,
			"code": "ROLE_ADMINISTRATOR",
			"name": "Administrator"
		}]
	}, {
		"id": 3,
		"email": "user3@test.com",
		"name": "User3",
		"roles": [{
			"id": 1,
			"code": "ROLE_ADMINISTRATOR",
			"name": "Administrator"
		}]
	}, {
		"id": 4,
		"email": "user4@test.com",
		"name": "User4",
		"roles": [{
				"id": 1,
				"code": "ROLE_ADMINISTRATOR",
				"name": "Administrator"
			},
			{
				"id": 2,
				"code": "ROLE_SELLER",
				"name": "Seller"

			}
		]
	}, {
		"id": 5,
		"email": "user5@test.com",
		"name": "User5",
		"roles": [{
			"id": 5,
			"code": "ROLE_LAWYER",
			"name": "Lawyer"

		}]
	}, {
		"id": 6,
		"email": "user6@test.com",
		"name": "User6",
		"roles": [{
			"id": 2,
			"code": "ROLE_SELLER",
			"name": "Seller"

		}]
	},
	{
		"id": 7,
		"email": "user7@test.com",
		"name": "User7",
		"roles": [{
			"id": 9,
			"code": "ROLE_SLA",
			"name": "sla"
		}]
	},
	{
		"id": 8,
		"email": "user8@test.com",
		"name": "User8",
		"roles": [{
			"id": 8,
			"code": "ROLE_BANK",
			"name": "Bank"

		}]
	},
	{
		"id": 9,
		"email": "user9@test.com",
		"name": "User9",
		"roles": [{
			"id": 7,
			"code": "ROLE_CPF",
			"name": "CPF"
		}]
	}
]
const filter = ['ROLE_SELLER', 'ROLE_BANK', 'ROLE_CPF', 'ROLE_SLA', 'ROLE_LDAU']

const filteredUsers = users.filter(user => !user.roles.find(role => filter.includes(role.id)))

console.log(filteredUsers)

Ожидаемый результат

 [{
        "id": 1,
        "email": "user1@test.com",
        "name": "User1",
        "roles": [{
                "id": 1,
                "code": "ROLE_ADMINISTRATOR",
                "name": "Administrator"
            },
            {
                "id": 2,
                "code": "ROLE_SELLER",
                "name": "Seller"

            }
        ]
    }, {
        "id": 4,
        "email": "user4@test.com",
        "name": "User4",
        "roles": [{
                "id": 1,
                "code": "ROLE_ADMINISTRATOR",
                "name": "Administrator"
            },
            {
                "id": 2,
                "code": "ROLE_SELLER",
                "name": "Seller"

            }
        ]
    }, {
        "id": 6,
        "email": "user6@test.com",
        "name": "User6",
        "roles": [{
            "id": 2,
            "code": "ROLE_SELLER",
            "name": "Seller"

        }]
    },
    {
        "id": 7,
        "email": "user7@test.com",
        "name": "User7",
        "roles": [{
            "id": 9,
            "code": "ROLE_SLA",
            "name": "sla"
        }]
    },
    {
        "id": 8,
        "email": "user8@test.com",
        "name": "User8",
        "roles": [{
            "id": 8,
            "code": "ROLE_BANK",
            "name": "Bank"

        }]
    },
    {
        "id": 9,
        "email": "user9@test.com",
        "name": "User9",
        "roles": [{
            "id": 7,
            "code": "ROLE_CPF",
            "name": "CPF"
        }]
    }
 ]

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Я думаю, что причиной этого было то, что вы пытаетесь сопоставить идентификатор роли с массивом 'filter', который содержит код роли. Из того, что я заметил по ожидаемому ответу, вы ищете пользователя, чья роль соответствует фильтру. Таким образом, следующее будет фильтровать по коду роли и с ожидаемым результатом

const filteredUsers = users.filter((user) => {
    return user.roles.map(role=>filter.includes(role.code)).includes(true)
})

эта строка кода в основном отображает фильтр для каждого объекта роли для каждого пользователя, если их код роли включен в фильтр, он добавит значение true в массив (возврат массива map ()) и для функции фильтра, если возвращаемый массив map () содержит true, а затем true (поэтому, в основном, || для всего массива)

0 голосов
/ 08 сентября 2018

Я пытаюсь представить, какой результат вы хотите получить ....

Вы хотите фильтровать пользователей по массиву с возможными ролями, другим мирам, если у пользователя есть одна из ролей массива фильтра, который вы хотите передать его массиву FilterUsers?

filter.includes (role.id) - я думаю, что это неправильно, может быть, вы хотите фильтр по ролям.код?

Array.find () не поддерживает Explorer https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Array.includes () - также не поддерживает Explorer. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...