如何在 REACT 中过滤一个简单的 table/array

How to filter a simple table/array in REACT

我正在寻找一种方法来轻松过滤并可能对以下内容进行排序 table。我尝试用

过滤它
      {data.getInteressentListing.edges.filter(node.name => node.name.includes('J')).map(({node}) => (

但这没有用。我还需要像搜索栏这样的东西,不仅过滤名称。它应该同时过滤所有列。也许你可以给我一些建议或简单的解决方案。

提前致谢

丹尼尔

这是我简单的工作代码table

import React from 'react';
import gql from 'graphql-tag';
import { Query } from 'react-apollo';
import Table from 'react-bootstrap/Table'

export const GET_POSTS = gql`
query   {
  getInteressentListing {
    edges {
      node {
        id
        Name
        Vorname
        Quelle
        Artikel
        Land
        Ort
        Tel
        Mobil
        EMail
        URL
        Whatsapp
        Telegram
        Notizen
        Geschlecht
      }
    }
  }
}
`;


const rowStyles = (post, canEdit) => canEdit(post)
  ? { cursor: 'pointer', }
  : {};

const PostViewer = ({ canEdit, onEdit }) => (
  <Query query={GET_POSTS}>
    {({ loading, data }) => !loading && (
      <Table >
        <thead>
          <tr>
            <th>Name</th>
            <th>Vorname</th>
            <th>Land</th>
            <th>Ort</th>
            <th>Tel.</th>
            <th>Mobil</th>
            <th>E-Mail</th>
            <th>Geschlecht</th>
          </tr>
        </thead>
        <tbody>
          {data.getInteressentListing.edges.map(({node}) => (
            <tr
              key={node.id}
              style={rowStyles(node, canEdit)}
              onClick={() => canEdit(node) && onEdit(node)}
            >
    <td> {node.Name} </td>
    <td> {node.Vorname} </td>
    <td> {node.Land} </td>
    <td> {node.Ort} </td>
    <td> {node.Tel} </td>
    <td> {node.Mobil} </td>
    <td> {node.EMail} </td>
    <td> {node.Geschlecht} </td>
             
            </tr>
          ))}
        </tbody>
      </Table>
    )}
  </Query>
);
PostViewer.defaultProps = {
  canEdit: () => true,
  onEdit: () => null,
};

export default PostViewer;

这是我取回数据时的格式。它里面有节点:

{
  "data": {
    "getInteressentListing": {
      "edges": [
        {
          "node": {
            "id": "1294",
            "Name": "Felix",
            "Vorname": "Hase",
            "Quelle": "Facebook",
            "Artikel": "Briefe",
            "Land": "Deutschland",
            "Ort": "KiKaLand",
            "Tel": "+49 0256/659552",
            "Mobil": "01525659565",
            "EMail": "felix@kika.de",
            "URL": "www.felixderhase.de",
            "Whatsapp": true,
            "Telegram": false,
            "Notizen": "Läuft im Fernsehen",
            "Geschlecht": "Divers"
          }
        },
        {
          "node": {
            "id": "1295",
            "Name": "Daniel",
            "Vorname": "Morgner",
            "Quelle": "eBay-Kleinanzeigen",
            "Artikel": "Omega",
            "Land": "Deutschland",
            "Ort": "Musterort",
            "Tel": "045692582",
            "Mobil": "015412,0",
            "EMail": "asdasd@web.de",
            "URL": "www.daniel.de",
            "Whatsapp": false,
            "Telegram": true,
            "Notizen": "asdasd",
            "Geschlecht": "Männlich"
          }
        },
        {
          "node": {
            "id": "1296",
            "Name": "Muster",
            "Vorname": "Max",
            "Quelle": "eBay-Kleinanzeigen",
            "Artikel": "Musterartikel",
            "Land": "Musterland",
            "Ort": "Musterort",
            "Tel": "+49255225488",
            "Mobil": "+49536256",
            "EMail": "Max@mustermann.de",
            "URL": "www.mustermann.org",
            "Whatsapp": true,
            "Telegram": null,
            "Notizen": "Hat viele Muster",
            "Geschlecht": "Männlich"
          }
        },
        {
          "node": {
            "id": "1297",
            "Name": "",
            "Vorname": "Peter",
            "Quelle": null,
            "Artikel": "Steine",
            "Land": "Deutschland",
            "Ort": "Musterort",
            "Tel": "07228562345",
            "Mobil": "01525654654654",
            "EMail": "peter-pan@web.de",
            "URL": "peter-walter.de",
            "Whatsapp": null,
            "Telegram": null,
            "Notizen": "Verkauft Steine",
            "Geschlecht": "Männlich"
          }
        },
        {
          "node": {
            "id": "1298",
            "Name": "Jakob",
            "Vorname": "Hund",
            "Quelle": null,
            "Artikel": "Hundefutter",
            "Land": "Traumland",
            "Ort": "Bagdad",
            "Tel": "0152519188723",
            "Mobil": "025105153",
            "EMail": "jakob@web.de",
            "URL": null,
            "Whatsapp": null,
            "Telegram": true,
            "Notizen": "Ist ein Hund",
            "Geschlecht": "Männlich"
          }
        }
      ]
    }
  }
}

我在查询中请求数据,请参阅上面的代码

第 1 步:我尝试使用状态中的模拟数据

this.state = {
  getInteressentListing: [
    {
      id: 1,
      Name: "Daniel",
      Vorname: "Daniel",
      Land: "Germany",
      Ort: "Deutschland",
      Tel: "9342423434",
      Mobil: "893434343434",
      EMail: "Daniel@gmail.com",
      Geschlecht: "Male"
    },
    {
      id: 2,
      Name: "Morgner",
      Vorname: "Morgner",
      Land: "Germany",
      Ort: "Denmark",
      Tel: "92323232344",
      Mobil: "942343434344",
      EMail: "Morgner@gmail.com",
      Geschlecht: "Male"
    },
    {
      id: 3,
      Name: "Jeba",
      Vorname: "Jeba",
      Land: "India",
      Ort: "Chennai",
      Tel: "8777788232323",
      Mobil: "923232323233",
      EMail: "jeba@gmail.com",
      Geschlecht: "Male"
    }
  ],
  selectedFilter: "id",
  filterByText: ""
};

第 2 步:输入更改输入以在 state

上设置
inputChange = (event) => {
  const { name, value } = event.target;
  this.setState({ [name]: value });
};

第 3 步:在 render 方法

中编写如下过滤函数
const filteredList = this.state.getInteressentListing.filter((item) => {
  if (this.state.selectedFilter && this.state.filterByText) {
    if (this.state.selectedFilter === "id") {
      return (
        item[this.state.selectedFilter] &&
        item[this.state.selectedFilter].toString() ===
          this.state.filterByText.toString()
      );
    } else {
      return (
        item[this.state.selectedFilter] &&
        item[this.state.selectedFilter]
          .toLowerCase()
          .includes(this.state.filterByText.toLowerCase())
      );
    }
  } else {
    return item;
  }
});

第 4 步:最后 html 模板将采用如下所示的渲染方法,

<div className="App">
    <select
      name="selectedFilter"
      onChange={this.inputChange}
      value={this.state.selectedFilter}
    >
      <option disabled value="" required>
        Search by
      </option>
      <option value="id">Id</option>
      <option value="Name">Name</option>
      <option value="Vorname">Vorname</option>
      <option value="Land">Land</option>
      <option value="Ort">Ort</option>
      <option value="Tel">Tel</option>
      <option value="Mobile">Mobile</option>
      <option value="EMail">EMail</option>
      <option value="Geschlecht">Geschlecht</option>
    </select>
    <input
      value={this.state.filterByText}
      name="filterByText"
      onChange={(e) => {
        this.inputChange(e);
      }}
      placeholder="Type here..."
    />
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Vorname</th>
          <th>Land</th>
          <th>Ort</th>
          <th>Tel.</th>
          <th>Mobil</th>
          <th>E-Mail</th>
          <th>Geschlecht</th>
        </tr>
      </thead>
      <tbody>
        {filteredList.map((node) => (
          <tr key={node.id}>
            <td> {node.Name} </td>
            <td> {node.Vorname} </td>
            <td> {node.Land} </td>
            <td> {node.Ort} </td>
            <td> {node.Tel} </td>
            <td> {node.Mobil} </td>
            <td> {node.EMail} </td>
            <td> {node.Geschlecht} </td>
          </tr>
        ))}
        {filteredList.length === 0 && (
          <tr>
            <td colSpan="8" style={{ textAlign: "center" }}>
              No Record Found
            </td>
          </tr>
        )}
      </tbody>
    </table>
  </div>

DEMO