У меня есть Observable<Recipe[]>
, который я хочу сократить до массива другого класса ChartData[]
, чтобы использовать его в качестве источника данных для графа старших диаграмм (столбец и круговая диаграмма).
Я пытаюсь использовать оператор канала RxJS на Observable<Recipe[]>
, чтобы вызвать оператор сокращения для моих данных, но я не могу заставить его работать? Оператор reduce
не выполняет итерации по этим элементам в моем Observable<Recipe[]>
Ниже приведена моя попытка:
this.foodService.getAllReceipes()
.pipe(
reduce((array: ChartData[], value: Recipe[], i: number) => {
const author = this.createOrFindAuthor(array, value[i]);
author.y += 1;
return array;
}, new Array<ChartData>())
)
.subscribe(data => this.chartData$ = of(data.sort((a, b) => b.y - a.y)));
}
getAllRecipes()
возвращает Observable<Recipe[]>
this.chartData$
является Observable<ChartData[]>
Я пытаюсь уменьшить это до ChartData[]
. Я смог сделать это в операторе subscribe
, и на графиках отображаются ожидаемые данные, но я подумал, что смогу сделать это как оператор с возможностью передачи данных? Вот что делается в рамках подписки:
this.foodService.getAllReceipes()
.subscribe((data) => {
const list = data.reduce((arr: ChartData[], v: Recipe) => {
const author = this.createOrFindAuthor(arr, v);
author.y += 1;
return arr;
}, new Array<ChartData>());
this.chartData$ = of(list.sort((a, b) => b.y - a.y));
});
Я пытался использовать код subscribe
в конвейере reduce
, но я получаю ошибки компиляции, говорящие, что метод ожидает Recipe[]
для значения. Но если я использую массив, тогда я получу только первый элемент из Observable (или я просто получаю Observable и мне нужно что-то с этим сделать?)
Возможно ли это или мой мыслительный процесс неверен в отношении того, как должен работать конвейерный оператор в Observable?
Для справки вот модели и функция createOrFindAuthor:
export class Recipe {
public Title: string;
public Author: string;
public Source: string;
public Page: number;
public Link?: string;
}
export class ChartData {
name: string;
y: number;
}
private createOrFindAuthor(array: ChartData[], recipe: Recipe): ChartData {
const name = (recipe.Author.length > 0 ? recipe.Author : 'UNKNOWN');
let found = array.find(i => i.name === name);
if (!found) {
const newData = new ChartData();
newData.name = name;
newData.y = 0;
array.push(newData);
found = newData;
}
return found;
}