【问题标题】:Filter json on React在 React 上过滤 json
【发布时间】:2018-07-04 20:50:01
【问题描述】:

我必须通过两种方式过滤这个数组,一种是在用户键入时,另一种是当他点击某个类别时,我的代码是这样的:

https://gist.github.com/pedroapfilho/dbd48b1bf10c4ff625929cb2f67c6b41

import React, { Component } from "react";
import "./App.css";
import appslist from "../apps.json";

import Sidebar from "../components/Sidebar/Sidebar";
import HeaderSearch from "../components/HeaderSearch/HeaderSearch";
import ListContainer from "../components/ListContainer/ListContainer";
import Pagination from "../components/Pagination/Pagination";

class App extends Component {
  state = {
    list: appslist,
    searchfield: "",
    selectedcategory: "",
    currentpage: 1,
    itensperpage: 3
  };

  onSearchChange = event => {
    this.setState({ searchfield: event.target.value });
  };

  onClickCategory = event => {
    this.setState({ selectedcategory: event.target.id });
  };

  render() {
    const {
      list,
      searchfield,
      currentpage,
      itensperpage,
      selectedcategory
    } = this.state;

    let filteredList;

    filteredList = list.filter(list => {
      return list.name.toLowerCase().includes(searchfield.toLowerCase());
    });

    filteredList = list.filter(list => {
      return list.categories[0].toLowerCase().includes(selectedcategory.toLowerCase());
    });

    return (
      <div className="flex-container">
        <Sidebar categorylist={list} selectedCategory={this.onClickCategory} />
        <section className="apps-list">
          <HeaderSearch searchChange={this.onSearchChange} />
          <ListContainer list={filteredList} />
          <Pagination currentPage={currentpage} itensperpage={itensperpage} />
        </section>
      </div>
    );
  }
}

export default App;

我把两个filteredList 都保留在那里,但只有最后一个可以工作

我怎样才能同时制作这两个作品?

【问题讨论】:

  • 必须尝试使用​​|| 运算符(如return condition1 || condition2)对其进行测试?
  • 你的appslist是什么样的?

标签: javascript json reactjs getjson


【解决方案1】:

您可以链接过滤器:

filteredList = list
    .filter(list => list.name.toLowerCase().includes(searchfield.toLowerCase()))
    .filter(list => list.categories[0].toLowerCase().includes(selectedcategory.toLowerCase()));

或者甚至把它写成一个过滤器:

filteredList = list.filter(
    list => list.name.toLowerCase().includes(searchfield.toLowerCase()) &&
            list.categories[0].toLowerCase().includes(selectedcategory.toLowerCase())
);

如果您需要 OR 行为而不是 AND,那么显然使用单一过滤器方法并将 &amp;&amp; 替换为 ||

关于评论中的问题:

要使用过滤器中的所有类别,您可以使用 someevery(取决于所需的逻辑):

filteredList = list.filter(
    list => list.name.toLowerCase().includes(searchfield.toLowerCase()) &&
            list.categories.some(
                cat => cat.toLowerCase() === selectedcategory.toLowerCase()
            )
);

【讨论】:

  • 如你所见,我只过滤了list.categories的第一个元素,我怎样才能通过它上面的所有元素呢?它有 1、2 或 3 个元素,如下所示:“类别”:[“语音分析”、“报告”、“优化”]、
  • 它正在使用链式过滤器,但似乎如果我使用一些,列表上不会出现任何内容
  • 我不确定你的结构,可能是我误解了什么是什么。但我假设你现在有知识自行修复它。
猜你喜欢
  • 2017-01-30
  • 2017-09-06
  • 2022-01-05
  • 2022-01-17
  • 2020-03-09
  • 2019-12-07
  • 2021-03-28
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多