具有反应形式值的Node js过滤器数组

时间:2019-06-23 18:13:40

标签: javascript node.js angular

我有从表单值过滤数组的探针。

我使用angular 7并表达js

export function getItems(req: Request, res: Response) {
  const itemCriteria: ItemCriteria = req.body.itemCriteria;
  const name = (itemCriteria.name) ? itemCriteria.name : '';
  const description= (itemCriteria.description) ? 
itemCriteria.description: '';
  const category= itemCriteria.category;

  const filterItems: Item[] = items
    .filter(item=> item.category.id === category &&
               item.name .includes(name ) &&
               item.description.includes(description)
    );

  res.status(200).json(filterItems);
}

当我填写所有字段时filterItems是正确的,但是当我仅填写一个或两个字段时,出现错误“无法读取未定义的属性”。该字段来自反应形式,但仅需一个,否则为可选。所以我的问题是如何正确过滤此数组?

2 个答案:

答案 0 :(得分:1)

如果Criteria中的一个为空,则不必将其包括在过滤器功能中。

因此您可以通过以下方式进行更改。

const filterItems: Item[] = items
  .filter(item=> (!category || (item.category && item.category.id === category)) &&
    (!name || (item.name && item.name.includes(name))) &&
    (!description || (item.description && item.description.includes(description))
  );

答案 1 :(得分:0)

您正在尝试读取未定义变量的属性。很难知道它是哪一个,但是您可以通过确保这样定义一个变量来保护代码免受这些类型的错误的影响:

const myProperty = someVariable && someVariable.someProperty

如果someVariable虚假,则会短路。

在您的情况下,可能看起来像这样:

const filterItems: Item[] = items
    .filter(item=> item && item.category && item.category.id === category &&
               item.name && item.name.includes(firstName) &&
               item.description && item.description.includes(lastName)
    );

(也不清楚firstName,lastName和项来自何处,但我不认为这是您要问的错误的原因)