Функция фильтра, которая поддерживает больше полей одновременно - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть эта функция, которая фильтрует элементы. Например, если у меня есть этот массив:

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=a и group=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, что string[])? Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете взять объект для нужных фильтров

{
    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);
0 голосов
/ 06 ноября 2018

Попробуйте это:

this.newArray = items.filter(
  singleItem => singleItem && singleItem.name === 'a' && singleItem.group === 'aa'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...