javascript - 数组方法错误: TypeError: Cannot read property 'filter' of undefined

标签 javascript ecmascript-6 lodash

所以,我试图从数组中删除一些元素。我有 2 个需要调用的过滤器。一种是使用搜索框过滤数据,另一种是根据条件过滤数据。但我收到此错误:

TypeError: TypeError: Cannot read property 'filter' of undefined

这是组件:

const PassengerCardBasedOnRoute = ({
  searchParam,
  passengerCardId,
  isAddToMyPassengersSuccess,
  unassignedDropOffPassengers,
}) => {

  // This is the filter that work based on a search parameter
  const filteredData = filterByParam =>
    filterByParam.filter(obj =>
      Object.keys(obj).some(key =>
        String(obj[key])
          .toLowerCase()
          .includes(searchParam.toLowerCase()),
      ),
    );

  // Here is where I need to remove from the array the condition met
  const filterByPassengerCardId = passengersData => {
    remove(passengersData, info => {
      return info.id === passengerCardId;
    });
  };

  const componentToRenderBasedOnParams = info => (
    <View key={info.id}>
      {isAddToMyPassengersSuccess && info.id === passengerCardId && (
        <PassengersAdded name={info.name} id={info.id} />
      )}
      <PassengersInfo
        id={info.id}
        name={info.name}
        searchParam={searchParam}
      />
    </View>
  );

  const showFeedbackIfNoLength = data => {
    if (!passengerCardId && size(filteredData(data))) {
      filteredData(data).map(info => componentToRenderBasedOnParams(info));
    } else if (passengerCardId) {

      // HERE IS WHERE THE APP THROWS THE ERROR
      filteredData(filterByPassengerCardId(data)).map(info =>
        componentToRenderBasedOnParams(info),
      );

    } else {
      return <EmptyState>No records found</EmptyState>;
    }

    return data;
  };

  return (
    <>
      <OptionsModal>{<AllPassengersOptionsModal />}</OptionsModal>
      <View>
        {!navigationStore.index && unassignedDropOffPassengers
          ? showFeedbackIfNoLength(unassignedDropOffPassengers)
          : null}
      </View>
    </>
  );
};

编辑

错误出现了:

  const filteredData = filterByParam =>
    // Here comes the error
    filterByParam.filter(obj =>
      Object.keys(obj).some(key =>
        String(obj[key])
          .toLowerCase()
          .includes(searchParam.toLowerCase()),
      ),
    );

当满足这个条件时:

      // HERE IS WHERE THE APP THROWS THE ERROR
      filteredData(filterByPassengerCardId(data)).map(info =>
        componentToRenderBasedOnParams(info),
      );

当满足其他条件时,一切正常:

   if (!passengerCardId && size(filteredData(data))) {
      filteredData(data).map(info => componentToRenderBasedOnParams(info));
    }

为了实现我的需要,我缺少什么?

最佳答案

看起来在表达式 filteredData(filterByPassengerCardId(data)) 中,filteredData 需要一个 Array;但是,filterByPassengerCardId(data) 返回未定义。

filterByPassengerCardId 的返回值更改为 Array,就不会再抛出错误。

编辑:看到您正在使用 Lodash 的 remove method 的评论事实上,它返回一个Array

在这种情况下,只需编辑filterByPassengerCardId即可返回调用remove的结果:

const filterByPassengerCardId = passengersData => {
  return remove(passengersData, info => {
    return info.id === passengerCardId;
  });
};

编辑:或者更好的是,为了简洁:

const filterByPassengerCardId = passengersData => (
  remove(passengersData, ({id}) => id === passengerCardId)
);

关于javascript - 数组方法错误: TypeError: Cannot read property 'filter' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896978/

相关文章:

javascript - 我如何关注 casperjs 网址

javascript - 如何在 Javascript (ECMAScript 6) 中确定 Set 是否包含没有引用的对象(动态添加到集合中)

javascript - 使用 ES6/lodash 进行迭代和过滤

javascript - JS 数组映射返回空

javascript - DataTables - 过滤和比较多列

javascript - 为什么 postMessage() 只给我最后一个 DOM 的信息?

分配左侧的 Javascript 对象括号表示法 ({ Navigation } =)

Javascript - 将多维数组与索引相结合

javascript - Lodash 有没有办法合并重复项?

javascript - 使用 lodash 链接 pluck() 和 flatten()