Необязательное связывание в сочетании с toLowerCase и indexOf во время сопоставления массива - PullRequest
1 голос
/ 20 июня 2020

Для автозаполнения ввода ищу в свойствах проекта во время набора. Теперь я хочу улучшить этот код

filterProjects(value: string) {
  return this.projects.filter(
    project =>
      project.key.toLowerCase().indexOf(value.toLowerCase().trim()) >=
        0 ||
      project.name.toLowerCase().indexOf(value.toLowerCase().trim()) >=
        0 ||
      project.description?.toLowerCase().indexOf(value.toLowerCase().trim()) >=
        0
  );
}

следующим образом:

filterProjects(value: string) {
  return this.projects.filter(project =>
    [project.key, project.name, project.description].map(
      str => str?.toLowerCase().indexOf(value.toLowerCase().trim()) >= 0
    )
  );
}

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

Но это не работает, то есть функция всегда возвращает массив без изменений. Кроме того, когда значение находится в описании одного элемента, массив не фильтруется только до этого элемента.

Какое может быть решение, кроме использования «старых» проверок, таких как if (str !== undefined) и т.п.?

Ответы [ 2 ]

3 голосов
/ 20 июня 2020

Этот map возвращает массив логических значений, который всегда является истинным, несмотря ни на что, поэтому это не тот предикат, который вы ищете. Вам понадобится Array.some (также в lodash / underscore / ramda, если вы планируете использовать старые браузеры). Позвольте мне немного подправить внутренний предикат:

filterProjects(value: string) {
  return this.projects.filter(project =>
    [project.key, project.name, project.description].some(str =>
      str ? str.toLowerCase().includes(value.toLowerCase().trim()) : false
    )
  );
}
1 голос
/ 20 июня 2020

Вы можете использовать `Nulli sh оператор объединения (??) '

например

str => (str ?? "").toLowerCase().indexOf(value.toLowerCase().trim()) >= 0
...