Объединение двух фильтров - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь выполнить два фильтра одновременно, однако моя реализация просто возвращает весь список вместо фильтрации, я предполагаю, что это из-за оператора ИЛИ, но я не уверен, почему это произойдет.

examBank = this.props.toggleExamBankState.tests.filter(
      (tests: ITest) =>
        tests.companyPN.includes("25000") ||
        this.props.toggleExamBankState.question.filter((questions: IQuestion) =>
          questions.companyPN.includes("250001)
        )
    );

    console.log(examBank);

Это данные, которые я пытаюсь отфильтровать.

Questions: [
  {
      companyPN: "250000"   
  },
  {
      companyPN: "250003"   
  },
  {
      companyPN: "251001"   
  }
]


Tests: [
  {
      companyPN: "250001"   
  },
  {
      companyPN: "250002"   
  },
  {
      companyPN: "251001"   
  }
]

Мое ожидаемое поведение, основанное на моем фильтре, должно вернуть

[
      {
          companyPN: "250000"   
      },
      {
          companyPN: "250001"   
      }
]

Но вместо этого он возвращает и Вопросы, и Тестовый список.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Вы пытаетесь фильтровать один, используя другой, но я думаю, что вам нужно применять фильтры отдельно. Причина, по которой ваш код возвращает полный массив, в том, что только массив тестов заключается в том, что ваш вложенный фильтр по крайней мере возвратит пустой массив [], а при сравнении с оператором || вам всегда будет что-то возвращено.

Я не знаю точный сценарий, по которому вы идете, но если вы хотите объединить записи ITest и IQuestion (хотя и не рекомендуется) в один массив, то это будет работать с использованием деструктуризации массива.

Я удалил включения, так как они не выглядели так, как будто они вам могут понадобиться, вы можете добавить их, если сравниваете частичные строки.

examBank = [
  ...this.props.toggleExamBankState.tests.filter(
      (test: ITest) => test.companyPN === <value>
    ),
  ...this.props.toggleExamBankState.question.filter(
      (question: IQuestion) => questions.companyPN === <value>
    )
]

const Questions = [
  { companyPN: "250000" },
  { companyPN: "250003" },
  { companyPN: "251001" }
]


const Tests = [
  { companyPN: "250001" },
  { companyPN: "250002" },
  { companyPN: "251001" }
]

const examBank = [
  ...Tests.filter(
      (test) => test.companyPN === "250001"
    ),
  ...Questions.filter(
      (question) => question.companyPN === "250000"
    )
]

console.log(examBank)
0 голосов
/ 09 октября 2019

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

let examBank = this.props.toggleExamBankState.tests.filter((tests: ITest) =>
        tests.companyPN.includes("25000"))
        .concat(
        this.props.toggleExamBankState.question.filter((questions: IQuestion) =>
          questions.companyPN.includes("250001)));

...