开发者问题收集

错误 TypeError:无法读取未定义的属性“filter”。我该如何修复?

2021-01-14
56641

我正在使用自定义过滤器来创建排序顺序,但从最不重要的开始,然后是下一个,但出现错误 “ERROR TypeError:无法读取未定义的属性‘filter’”

请帮我修复,因为它不允许在页面上呈现任何内容。

我需要做哪些更改来解决这个问题?任何帮助都值得赞赏。

table-filter.pipe.ts

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
  name: "tableFilter"
})
export class TableFilterPipe implements PipeTransform {
  transform(list: any[], filters: any) {
    //console.log("table-filter", list);
    const keys = Object.keys(filters).filter(key => filters[key]);
    const filterUser = (user: { [x: string]: any }) =>
      keys.every(key => {
        if (key == "sdob") {
          return (
            new Date(user["dob"]) >=
            new Date(new Date(filters[key]).setHours(0, 0, 0, 0))
          );
        } else if (key == "edob") {
          return (
            new Date(new Date(filters[key]).setHours(0, 0, 0, 0)) >=
            new Date(user["dob"])
          );
        } else if (
          key === "dl" &&
          user["assigned_to"].filter((e: { dl: any }) => e.dl === filters[key])
            .length
        ) {
          return user;
        } else if (key === "score") {
          const low = filters[key] === "20" && user["score"] <= filters[key];
          const medium =
            filters[key] === "50" && user["score"] < 50 && user["score"] >= 21;
          const high =
            filters[key] === "70" && user["score"] < 70 && user["score"] >= 51;
          const veryHigh = filters[key] === "71" && user["score"] >= 71;
          if (low || medium || high || veryHigh) {
            return user[key];
          }
        } else {
          return user[key] === filters[key];
        }
    });    

    if(list) {
      let filterList = list.filter(filterUser);
      list.sort((lhs, rhs) =>this.lowestScore(lhs.assigned_to) - this.lowestScore(rhs.assigned_to));
    }
    //console.log(filterList, list);

    return keys.length ? list.filter(filterUser) : list;
  }
  
  lowestScore(assign: any) {
    //console.log("assign ", assign);
    let filterData = assign.filter(item => Number(item.co_score));
    let leastScrore = Math.min(...filterData.map(item => item.co_score));
    //console.log("least ", leastScrore);
    return leastScrore;
  }
}
3个回答

错误表明您正在调用“.filter”的对象之一未定义。该对象可能是以下行之一:

const keys = Object.keys(filters).filter

  • 如果“filters”没有键,则将失败。如果您没有将过滤器传递给转换函数,则这似乎是可能的候选者。

user["assigned_to"].filter

  • 如果 user 没有此属性或它不是数组,则将失败。

let filterData =assign.filter

  • 如果传递 lowestScore 则将失败 undefined
rand'Chris
2021-01-14

错误消息抱怨这一点:

return keys.length ? list.filter(filterUser) : list;

当您的 list 未定义,并且您有 keys 时,它将尝试执行 list.filter ,由于 list 未定义,因此您会收到这样的错误。

Bryan Yin
2021-01-14

根据您的浏览器,您还可以执行以下操作:

return list?.filter(filterUser) || list
SarahJ
2021-12-24