Как фильтровать вложенный массив с помощью функции «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))
Другие вопросы по тегам