Skip to main content

react-fuse - how to perform specific search with fuse

I am having trouble performing an aggressive search with fuse, where my search result will only return the one item with matching title, or role from either Buffed or Nerfed genre.

I have a json file where I am pulling data from using Firebase. This is my json file:

//Buffed
    firebase.firestore().collection('Buffed').add({
        id: getUUID(),
        title: 'Cyclops',
        description: 'A mysterious celestial traveler' 
        role: 'Mage',
        genre: 'Buffed',
    });
    firebase.firestore().collection('Buffed').add({
        id: getUUID(),
        title: 'Esmeralda',
        description: 'Family Member of Agelta' 
        role: 'Mage',
        genre: 'Buffed',
    });
    firebase.firestore().collection('Buffed').add({
        id: getUUID(),
        title: 'Paquito',
        description: 'Nobody' 
        role: 'Fighter',
        genre: 'Buffed',
        
    });
//Nerfed
    firebase.firestore().collection('Nerfed').add({
        id: getUUID(),
        title: 'Hayabusa',
        description:'Shadow Warrior'
        role: 'Assassin',
        genre: 'Nerfed',
    });
    firebase.firestore().collection('Nerfed').add({
        id: getUUID(),
        title: 'Karrie',
        description: 'War Machine'
        role: 'Marksman',
        genre: 'Nerfed',
    });
    firebase.firestore().collection('Nerfed').add({
        id: getUUID(),
        title: 'Gloo',
        description: 'Dark Creature'
        role: 'Tank',
        genre: 'Nerfed',
    });

I am getting these data from Fireabase using this filter.js file:

export default function selectionFilter({ Nerfed, Buffed } = []) {

    return {
      Buffed: [
        { title: 'Buffed', data: Buffed?.filter((item) => item.genre === 'Buffed') },
      ],
      Nerfed: [
        { title: 'Nerfed', data: Nerfed?.filter((item) => item.genre === 'Nerfed') },
      ],
 };
  }

This is my search function located in a index.js file under header:

Header.Search = function HeaderSearch({ searchTerm, setSearchTerm, ...restProps }) {
  
  const [searchActive, setSearchActive] = useState(false);

  return (
    <Search {...restProps}>
      <SearchIcon onClick={() => setSearchActive((searchActive) => !searchActive)} data-testid="search-click">
        <img src="/images/icons/search.png" alt="Search" />
      </SearchIcon>
      <SearchInput
        value={searchTerm}
        onChange={({ target }) => setSearchTerm(target.value)}
        placeholder="Search Heroes"
        active={searchActive}
        data-testid="search-input"
      />
    </Search>
  );
};

This is my index.js file where I am doing my search using Fuse.

import React, { useState, useEffect, useContext } from 'react';
import { Card, Header, Loading} from '../components';

export function BrowseContainer ({slides}) {

  const [category, setCategory] = useState('Buffed');
  const [searchTerm, setSearchTerm] = useState('');
  const [slideRows, setSlideRows] = useState([]); 

  useEffect(() => {
    setSlideRows(slides[category]);
  },
  
  [slides, category]);

  useEffect(() => {
    
    const fuse = new Fuse(slideRows, { keys: ['data.genre','data.description', 'data.title', 'data.role'] });

    const results = fuse.search(searchTerm).map(({ item }) => item);

    if (slideRows.length > 0 && searchTerm.length > 3 && results.length > 0) {
      setSlideRows(results);
    } else {
      setSlideRows(slides[category]);
    }
  }, [searchTerm]) ;
 
return profile.displayName ? (
  <Header.Frame>
          <Header.Group>
            <Header.TextLink active={category === 'Buffed' ? 'true' : 'false'} onClick={() => setCategory('Buffed')}>
              Buffed
            </Header.TextLink>
            <Header.TextLink active={category === 'Nerfed' ? 'true' : 'false'} onClick={() => setCategory('Nerfed')}>
              Nerfed
            </Header.TextLink>
           </Header.Group>
           <Header.Group> 
            <Header.Search searchTerm={searchTerm} setSearchTerm={setSearchTerm} />
           </Header.Group>
           <Card.Group>
        {slideRows.map((slideItem) => (
          <Card key={`${category}-${slideItem.title.toLowerCase()}`}>
            <Card.Title>{slideItem.title}</Card.Title>
            <Card.Entities>
              {slideItem.data.map((item) => (
                <Card.Item key={item.docId} item={item}>
                  <Card.Image src={`/images/${category}/${item.title}/small.jpg`} />
                  <Card.Meta>
                    <Card.SubTitle>{item.title}</Card.SubTitle>
                    <Card.Text>{item.role}</Card.Text>
                  </Card.Meta>
                </Card.Item>
              ))}
            </Card.Entities>
            <Card.Feature category={category}>  
            </Card.Feature>
          </Card>
        ))}
      </Card.Group>

)}

My search cons Result is returning the entire slideRow where the searched item is located. I only want to return the one item with matching title, or role from either Buffed or Nerfed genre.

Via Active questions tagged javascript - Stack Overflow https://ift.tt/EweaSqm

Comments

Popular posts from this blog

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

The number of nodes and edges I calculated manually and by a method provided by networkx library dont match

I am trying to analyse a graph using networkx library in Python. I have implemented a function that returns the nodes and edges of that graph. After that I counted the number of nodes and edges by implementing the len() function for nodes and edges, which gave me 17 for both nodes and edges. However, when I used the method graph.number_of_nodes() of networkx library it gave me 53. My code: import pandas as pd import networkx as nx import matplotlib.pyplot as plt header_list = ["a","b","w"] E =pd.read_csv("aves-barn-swallow-contact-network.edges",sep=" ",header= None,names=header_list) # print(E.head()) # prints first few rows of the csv file G = nx.from_pandas_edgelist(E,"a","b",["w"]) nx.draw(G) plt.show() class GraphAnalyse: #finding nodes and edges def nodeEdge(self,Graph): nodes = Graph.nodes() edges = Graph.edges() ...