【问题标题】:TypeError: Cannot read property 'filter' of undefined - Data an objectTypeError:无法读取未定义的属性“过滤器” - 数据对象
【发布时间】:2020-12-06 21:56:35
【问题描述】:

我正在尝试将一些数组项映射到过滤器下拉列表中以对数组输出进行排序。但是,我收到一个错误 - 'TypeError:无法读取未定义的属性'过滤器'。我很确定这取决于数据是一个对象。我对 JS 很陌生,所以不确定下一个最佳步骤是什么。

任何关于正在发生的事情和我需要改变什么的指针都会很棒。如果您需要更多信息,请告诉我。 -

import React, { useState, Fragment } from "react";
import { graphql } from 'gatsby'

const Page = ({data}) => {
  console.log('data is', data)
  const [filters, setFilters] = useState({
   type: "",
   propertyStatus: ""
 });

  const filteredProperties = data.edges.nodes.filter((node) =>
    Object.entries(filters).every(([filterName, filterValue]) => {
      if (filterValue === "") {
        return true;
      }

      return node[filterName] === filterValue;
    }),
  );

  return (
    <Fragment>
      {Object.entries(filters).map(([filterName, filterValue]) => {
        const allValuesForFilterKey = data.edges.nodes.map(
          (node) => node[filterName],
        );
        const uniqueValuesForFilterKey = [...new Set(allValuesForFilterKey)];

        return (
          <label style={{ marginRight: 10 }}>
            <span style={{ marginRight: 5 }}>{filterName}:</span>
            <select
              value={filterValue}
              onChange={(event) => {
                event.persist();
                setFilters((previousFilters) => {
                  return {
                    ...previousFilters,
                    [filterName]: event.target.value,
                  };
                })
              }                
             }
            >
              <option value="">No filter</option>
              {uniqueValuesForFilterKey.map((value) => (
                <option value={value}>{value}</option>
              ))}
            </select>
          </label>
        );
      })}

      <ul>
        {filteredProperties.map((node) => (
          <li>
            {node.name}
            <br />
            type: {node.type}
            <br />
            category: {node.category}
          </li>
        ))}
      </ul>
    </Fragment>
  );
}

export const query = graphql`
  query yourQueryName{
      allStrapiHomes {
        nodes {
          type
          propertyStatus
        }
      }
  }
`

export default Page

控制台日志输出是这样的

【问题讨论】:

  • 你有一个错字。将此行 data.edges.nodes.filter 更改为此 data.edges.filter。仅仅因为data.edges 是一个数组而filter 是一个数组方法:D

标签: javascript arrays reactjs filter


【解决方案1】:

data.edges 是数组,data.edges.nodes 将是未定义的。

filter()是数组的方法。

const filteredProperties = data.edges.filter((edge) =>
    Object.entries(filters).every(([filterName, filterValue]) => {
      if (filterValue === "") {
        return true;
      }

      return edge.node[filterName] === filterValue;
    }),
  );

【讨论】:

  • 谢谢!更改为 data.edges,它现在让我看到 UI,它具有正确数量的项目,但是所有字段和下拉列表都是空白的。猜猜这是由于没有指示索引,但我不确定该怎么做,任何指针?
  • 抱歉,新代码仍然存在同样的问题
  • 您是否也在渲染中进行了更新? const allValuesForFilterKey = data.edges.map( (edge) => edge.node[filterName], );
猜你喜欢
  • 2021-12-26
  • 2019-03-26
  • 2021-10-31
  • 2020-10-22
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多