开发者问题收集

过滤函数返回未定义

2019-11-13
1722

我的 React 应用通过 api 调用获取员工列表。我有一个类似的部门组件函数,可以根据名称筛选出部门。当我对具有 first_name 和 last_name 属性的员工执行类似操作时,我收到错误

TypeError:无法读取未定义的属性“toLowerCase”

但是当我 console.log 响应时,名称没有问题。

下面是我使用的 useEffect 钩子

 useEffect(() => {
    if (props.data !== undefined) {
      const results = props.data.filter(
        resp =>
          resp.first_name.toLowerCase().includes(filter) +
          " " +
          resp.last_name.toLowerCase().includes(filter)
      );
      setFilteredResults(results);
    }
  }, [filter, props.data]);

我将过滤后的结果放入数组中的状态,然后映射到它们以显示

3个回答

很难确切地说出您尝试使用过滤方法做什么,但是 Array.prototype.filter 接受一个回调,当调用时,该回调被强制转换为布尔值。如果该布尔值对于给定的数组元素为真,则该结果将包含在过滤列表中。如果它为假,则不包含结果。

假设您返回一个非空字符串,则所有结果都会显示出来;我认为这会让您更接近您想要做的事情:

useEffect(() => {
    if (props.data !== undefined) {
      const results = props.data.filter(
        resp =>
          (resp.first_name && resp.first_name.toLowerCase().includes(filter))
          &&
          (resp.last_name && resp.last_name.toLowerCase().includes(filter))
      );
      setFilteredResults(results);
    }
  }, [filter, props.data]);

在尝试访问 first_namelast_name 之前,使用简单的值/空检查来确保 resp 上没有未定义。

gabriel.hayes
2019-11-13

我认为避免这种情况的最简单方法是先检查 resp.first_name 是否不为空,然后调用 toLowerCase 函数。

Milan Toncic
2019-11-13

您的过滤函数可能看起来像这样,否则您返回的不是布尔值而是字符串:

const results = props.data.filter(
  resp => (resp.first_name || '').toLowerCase().includes(filter) &&
  (resp.last_name || '').toLowerCase().includes(filter)
);
Clarity
2019-11-13