Функция предиката «Оператор фильтра» возвращает все элементы в массиве - PullRequest
0 голосов
/ 27 мая 2018

У меня есть Observable массива объектов.Каждый объект имеет свойство id.Я использую метод фильтра с целью вернуть только наблюдаемый объект, который соответствует определенному идентификатору.

Когда я реализую следующий код, функция предиката возвращает весь массив.Я ожидаю, что пройдет только один элемент.

    this.blog$ = this.store.select('posts', 'blogs').pipe(
      filter((post, index) => {
        console.log(post[index].id == this.id);
        return post[index].id == this.id
      }),
    ).subscribe(x=>console.log(x))

enter image description here

Первый консольный журнал находится внутри функции фильтра, второй вызывается из метода подписки.

Если моя функция сравнения оценивается как истинная, только для определенного идентификатора, как я могу правильно получить только проходящий объект?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Полная альтернатива rx будет:

this.blog$ = this.store.select('posts', 'blogs').pipe(
  mergeAll(),
  filter(post => post.id == this.id)
).subscribe(post => console.log(post))
0 голосов
/ 27 мая 2018

Функция фильтра rxjs используется для фильтрации каждого излучения, поэтому, если это происходит один раз с массивом, вам нужно будет использовать функцию фильтра массивов вместе с map вместо

this.blog$ = this.store.select('posts', 'blogs').pipe(
  map((posts) => posts.filter((post) => post.id == this.id))
).subscribe(x=>console.log(x))

Альтернативно, если вам нужно только первое совпадение и вы хотите получить результат в виде объекта вместо массива с 1 элементом, просто используйте вместо него функцию массива find:

this.blog$ = this.store.select('posts', 'blogs').pipe(
  map((posts) => posts.find((post) => post.id == this.id))
).subscribe(x=>console.log(x))
...