фильтр поиска в js

#javascript #arrays #reactjs

#javascript #массивы #reactjs

Вопрос:

Я создал фильтр поиска, который выглядит следующим образом:

 const booksrow = books amp;amp; books.map(book=>{
 if(pattern.test('all')||pattern.test(book.genre.toLowerCase())||pattern.test(book.title.toLowerCase())||pattern.test(book.author.toLowerCase())){
  return <Book  book={book} books={books}/>
}
})
 

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

  const booksrow = books amp;amp; books.map(book=>{
if(pattern.test('all')||pattern.test(book.genre.toLowerCase())||pattern.test(book.title.toLowerCase())||pattern.test(book.author.toLowerCase())){
  return <Book  book={book} books={books}/>
}else {
 return 'Default message'
 }
})
 

Но это не сработает, потому что оно вернет это сообщение по умолчанию, основанное на карте.

Ответ №1:

Используйте filter вместо map , затем вы можете проверить, является ли отфильтрованный массив пустым или нет:

 const filtered = books
    ?.filter(book => (
        pattern.test('all') ||
        ['genre', 'title', 'author'].some(prop => pattern.test(book[prop].toLowerCase()))
    ))
    .map(book => <Book book={book} books={books} />);
const booksRow = filtered?.length ? filtered : 'Default message';