我有一个Observable<Recipe[]>
我想简化为不同类的数组ChartData[]
以用作高图(列和饼图)的数据源。
我正在尝试使用 RxJS 管道运算Observable<Recipe[]>
符对我的数据调用 reduce 运算符,但我无法让它工作?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;
}