Как должна выглядеть моя труба для фильтрации через объект - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать канал для фильтрации своего ответа.

Я сделал что-то вроде этого:

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

@Pipe({
    name: 'filter',
})
export class FilterPipe implements PipeTransform {
    transform(value: any, input: string) {
        if (input) {
            input = input.toLowerCase();
            return value.filter(function (el: any) {
                return el.recipients.toLowerCase().indexOf(input) > -1;
            })
        }
        return value;
    }
}

Но у меня появилась ошибка:

ERROR TypeError: value.filter is not a function
    at FilterPipe.transform (FilterPipe.ts:10)

Это моя строка

 <tr
    *ngFor="let r of recipients.recipients | FilterPipe: query | split; let i = index">
    <td>{{r}}</td>

и мой ввод

<input class="form-control form-control-alternative" placeholder="Szukaj odbiorcy" type="text"
 [(ngModel)]="query">

Мои получатели вывод:

 console.log('this.recipients ' +JSON.stringify(this.recipients));

this.recipients {"recipients": "testee "}

Как мне отфильтровать свой объект, чтобы получить результат?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020
  1. Вы запускаете recipients.recipients через ngFor, так что он должен быть Iterable (например, Array), и я вижу, что его строка: «recipients»: «проверено».

  2. В вашем канале у вас уже есть каждый получатель, поэтому вам нужно изменить el.recipients.toLowerCase () на el.toLowerCase ()

0 голосов
/ 07 мая 2020

Массив имеет метод filter, но ваш value является типом объекта, поэтому вы получили ошибку:

значение. Фильтр не является функцией

Итак, вам нужно преобразовать ваш объект в массив:

transform(value: any, input: string) {
    if (input && typeof input ==='string') {
        input = input.toLowerCase();
        if (Array.isArray(value)) {
            return value.filter(function (el: any) {
                return el.recipients.toLowerCase().indexOf(input) > -1;
            })
        } else if (typeof value === 'object' && value !== null) {
             const filtered = Object.entries(value)
                 .filter(([k, v])=> v.toLowerCase() === input.toLowerCase());
             return Object.fromEntries(filtered);
        }
    }
    return value;
}

Пример:

    let obj = {"recipients":"testee", 'foo': 'bar'};
    let input = 'testee';
    const filtered = Object.entries(obj).filter(([k, v])=> v.toLowerCase() === input.toLowerCase());
    console.log(Object.fromEntries(filtered));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...