过滤功能,可同时支持更多字段

时间:2018-11-06 14:46:25

标签: javascript angular

我有此功能可以过滤元素。例如,如果我有以下数组:

arr = [{'name': 'a', 'group': 'aa'}, {'name': 'b', 'group': 'bb'}, {'name': 'c', 'group': 'cc'}, {'name': 'a', 'group': 'dd'}]

然后我用'name=a'进行过滤,它将返回我

{'name': 'a', 'group': 'aa'}
{'name': 'a', 'group': 'dd'}

但是我该如何提出另一个条件,而不仅限于name。例如,我要搜索name=agroup=aa之后并返回:

{'name': 'a', 'group': 'aa'}

这是我的功能,但目前仅接收一个字段

  transform(items: any[], field: string, value: string[]): any[] {
    if (!items) {
      return [];
    }
    if (!field || !value || value.length <= 0) {
      return items;
    }

    this.newArray = items.filter(singleItem => {
      return (singleItem != null && singleItem[field] != null && singleItem[field] != undefined && value.indexOf(singleItem[field]) >= 0);
    });

    return this.newArray
  }

如何修改它(做类似value的{​​{1}}之类的事情)?谢谢您的时间!

2 个答案:

答案 0 :(得分:2)

您可以将一个对象用作所需的过滤器

{
    name: 'a',
    group: 'aa'
}

并通过与对象的值进行检查来迭代此键/值。

这种方法接受任意数量的属性。

var array = [{ name: 'a', group: 'aa' }, { name: 'b', group: 'bb' }, { name: 'c', group: 'cc' }, { name: 'a', group: 'dd' }],
    filter = { name: 'a', group: 'aa' },
    result = array.filter(o => Object.entries(filter).every(([k, v]) => o[k] === v));
    
console.log(result);

答案 1 :(得分:0)

尝试一下:

this.newArray = items.filter(
  singleItem => singleItem && singleItem.name === 'a' && singleItem.group === 'aa'
);