Оператор filter
в первом примере отличается от функции массива filter
.
Rx JS filter
Rx JS filter
выберет чтобы пропустить наблюдаемую ценность на основе условия. Это условие для всего объекта.
Первый пример работает, потому что from
испускает каждый элемент последовательно, а затем filter
воздействует на каждый элемент индивидуально, отбрасывая те, которые не соответствуют условию. Если вы удалите фильтр, вы увидите, что в метод подписки поступают 2 элемента последовательно.
DEMO: https://stackblitz.com/edit/angular-ef3udf
Запрос http возвращает только одно значение , filter
пытается проверить условие по всему ответу и жалуется, что свойство rating
не существует в массиве (это именно то, что говорит сообщение об ошибке).
Фильтр массива
Array filter
вернет элементы в массиве, соответствующие условию. Он проверяет условие для каждого элемента в массиве.
Решение
Вы получаете один объект из HttpClient
- ответа. Вы хотите условно удалить некоторые элементы. Это преобразование - вы начинаете с массива и возвращаете подмножество этого массива.
Для преобразований в канале вы используете оператор Rx JS map
(не путать с функцией массива !). Затем вы можете применить функцию массива filter
внутри Rx JS map
.
isVeryGoodAd(): Observable<Hero[]> {
return this.http.get<Hero[]>(this.heroesUrl).pipe(
map(heroes => heroes.filter(hero => hero.rating === 'verygood'))
);
}