Группировка RXJS по наблюдаемому / массиву

#angular #typescript #rxjs #observable

Вопрос:

У меня есть объект наблюдения, содержащий массив объектов новостных статей, которые я хочу сгруппировать по дате, чтобы я мог использовать его в своем шаблоне.

введите описание изображения здесь

Я читал об операторе groupBy, но пока не могу заставить его работать. Я настроил массив, который заполняю массивом элементов в моем наблюдаемом:

     export class NewsArchiveComponent implements OnInit {

  archivedNews$: Observable<NewsItemPage> | undefined;
  newsItems: NewsItem[] = [];

  constructor(private newsService: NewsService) { }

  ngOnInit(): void {
    this.archivedNews$ = this.newsService.newsPerYear();
    this.fillNewsArray();
  }

  fillNewsArray() {
    this.archivedNews$?.subscribe(x => {
      this.newsItems = x.items;
      console.log(x);
      console.log(this.newsItems);
    });
  }
}
 

Я попытался сгруппировать свои элементы следующим образом, но это не сработало, и он не вошел в консоль:

 groupNewsItems() {
    of(this.newsItems)
      .pipe(
        concatMap(res => res),
        groupBy(item => item.publicationdate),
        mergeMap(group => zip(of(group.key), group.pipe(toArray())))
      )
      .subscribe(console.log);
  }
 

Ответ №1:

Используйте from вместо of и попробуйте следующее:

 import { from, of, zip } from 'rxjs';
import { groupBy, mergeMap, toArray } from 'rxjs/operators';

from(this.newsItems)
  .pipe(
    concatMap(res => res),
    groupBy(
     item => item.publicationdate
    ),
    mergeMap(group => zip(of(group.key), group.pipe(toArray())))
)
.subscribe(console.log);