【问题标题】:Filtering arrays in JS/React在 JS/React 中过滤数组
【发布时间】:2021-06-30 21:58:33
【问题描述】:

所以这里我有搜索功能。除非在数组中找不到 Item ,否则一切正常。我已经尝试过使用 objects.Keys 的东西,但它在渲染上显示它,而不是在没有像它应该的那样找到 Book 时显示它。我应该使用 if 语句还是。

import React,{useState, useEffect, useRef, useContext}from 'react'
import {FaSearch} from 'react-icons/fa'
import { 
    Link, useHistory
  } from "react-router-dom";
import { BookContext } from '../../context/books';
import SearchBooks from './SearchBooks';

const Search = () => {

  const {data}= useContext(BookContext)
  const [searchValue, setSearchValue] = React.useState('');
  const history= useHistory()
  const ref=useRef()

  function filterBooks(book) {
    console.log(book);
    if (!searchValue.length  ) return false;
    return book.bookName?.toLowerCase().includes(searchValue.toLowerCase());
  }

  const handleSearch = (e) => {
    if (ref.current && !ref.current.contains(e.target)) {
     setSearchValue('')
    }
  };
     
  useEffect(() => {
    document.addEventListener('click', handleSearch);
    return () => {
      document.removeEventListener('click', handleSearch);
    };
  }, []);
  

  
        return (
        <div className='search__cont' ref={ref}>   
              {Object.keys(data).filter(filterBooks).length === 0 &&(
           <div>
             <h3>Book not found</h3>
             </div>
         )}
           <SearchBooks searchValue={searchValue} setSearchValue={setSearchValue }/>          
           {Object.keys(data)
             .map((key) => data[key])
             .reduce((acc, curr) => acc.concat(curr), [])
             .filter(filterBooks)
             .map((book) => {          
             return (
             <>       
              <div  className='search__books'
                onClick={() => {
                  history.push("/book/id", { book }); setSearchValue('')
                }}
               >            
                {" "}
                {book.bookName}{" "}
              </div>            
            </>
          );
        })}
           </div>
    )
}

export default Search

【问题讨论】:

  • 如果你认为这个我忘了删除它if(!searchValue.length ) return book.bookName &gt; 10 。那是你推我的尝试。我知道这是错误
  • 问题是这样的。未找到搜索值时,它不显示“未找到任何书”。我有 10 个相互连接的组件。所以创建沙箱至少需要 20 分钟。如果你不知道你就不知道

标签: javascript json reactjs filtering


【解决方案1】:

您正在过滤类别名称而不是书籍(data 是一个以类别名称作为键,书籍作为值的对象)。您可以使用Object.valuesArray.prototype.flat 获取所有书籍的数组,然后应用过滤器。

const filteredBooks = Object.values(data).flat().filter(filterBooks)
const searchQueryPresent = searchValue.trim().length > 0
{
  searchQueryPresent &&
    (filteredBooks.length === 0 ? (
      <div>No books found</div>
    ) : (
      filteredBooks.map((book) => {
        return <>{/* render books */}</>
      })
    ))
}

【讨论】:

  • filterBooks 返回 false,这意味着项目不会像我想要的那样首先显示在渲染上。但在你的情况下是真的。所以这意味着当它为假时,我在第一次渲染时看到未找到书,而不是在未找到项目时
  • @mura1 仅当存在搜索查询时,您才能呈现图书列表或“未找到图书”消息。刚刚更新了我的答案和链接的 CodeSandbox。
  • 谢谢。我知道这不是问题,但是我将如何将搜索值的数量降低到最大到 10。现在如果我输入一个单词,它会显示一堆它们
  • @mura1 您可以使用Array.prototype.slice 返回数组的一部分。刚刚更新了 CodeSandbox 给你一个想法。
猜你喜欢
  • 2020-09-15
  • 1970-01-01
  • 2018-12-29
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2018-05-26
相关资源
最近更新 更多