Как фильтровать вложенный массив с помощью функции «includes()» в реакции
У меня есть несколько профилей пользователей, похожих на приведенные ниже...
"user": {
"firstName": "Joe",
"lastName": "Bloggs",
"userRole": [
{
"id": 1,
"name": "Role 001",
},
{
"id": 2,
"name": "Role 002",
},
{ etc... }
],
}
Каждый пользователь может иметь комбинацию различных ролей. Мне нужно фильтровать моих пользователей на основе строки, разделенной запятыми, например {"Роль 001", "Роль 004"}... что-то вроде поля, содержащего список ролей, и использования функции включения, но для массива.
Мой компонент...
<Signoff
name="sign"
signOff={signOff}
signUserRole={["Role 001","Role 004"]} <--- my comma delimited string param. Not sure if I'm defining this correctly.
signHeaderTitle="Person signature required"
/>
Моя пользовательская схема...
const userSchema = new Schema(
{
firstName: { type: String, required: true },
lastName: { type: String, required: true },
userRole: [
{
id: { type: Number },
name: { type: String },
},
],
},
{ _id: true, timestamps: true }
);
Мои критерии фильтра основаны на одном раскрывающемся списке MUIAutocomplete, который работает отлично...
setSigneeOptions(
responseData.users
.filter((value) =>
value?.userRole?.name === signUserRole // trying to do something like this --> value?.userRole?.name.including(signUserRole)
: 1 === 1
)
.sort((a, b) => (a.name > b.name ? 1 : -1))
)
Мне нужно, чтобы мой MUIAutocomplete был множественным выбором, и я не понимаю, как фильтровать его набор параметров, чтобы включить только те роли, которые определены в моей строке, разделенной запятыми. {"Роль 001", "Роль 004"}. Надеюсь, я говорю разумно. Любые указатели оценены.
2 ответа
Решение O(n2) выглядит следующим образом:
responseData.users
.filter((value) => signUserRole.includes(value?.userRole?.name))
.sort((a, b) => (a.name > b.name ? 1 : -1))
Но лучшим решением O(n) было бы конвертироватьsignUserRole
кSet
вместоArray
и иметь логику, как показано ниже:
responseData.users
.filter((value) => signUserRole.has(value?.userRole?.name))
.sort((a, b) => (a.name > b.name ? 1 : -1))
Вы можете фильтровать пользователей по
responseData.users?
.filter((user) =>
// you can use `.every()` to filter users with all signUserRole,
// `.some()` to filter users with any of signUserRole
signUserRole.every(role =>
user.userRole.find((userRole) => userRole.name === role)
)
)
.sort((a, b) => (a.name > b.name ? 1 : -1))