我正在尝试通过在我的可观察范围内使用.distinct()来过滤出重复项,但它没有任何作用,而且我没有错误。...
this.settingsService.getGuruQueries().subscribe(queries => {
of<any>(queries).pipe(distinct((p: any) => p['book']), ).subscribe(x => console.log(x));
我的console.log显示重复:
{book: "XBIL", grid: "NATGRI", concept: "STT_XBIL", query: "XBIL_NATGRI", customer: "A", …}
{book: "XBIL", grid: "IT-ANY", concept: "STT_XBIL", query: "XBIL_IT-ANY", customer: "A", …}
{book: "IBIL", grid: "NATGRI", concept: "STT_IBIL", query: "IBIL_NATGRI", customer: "A", …}
{book: "IMIL", grid: "IT-ANY", concept: "STT_IMIL", query: "IMIL_IT-ANY", customer: "A", …}
{book: "IDAFR", grid: "RTE", concept: "STT_IDAFR", query: "IDAFR_RTE", customer: "A", …}
{book: "IDCOM", grid: "RTE", concept: "STT_XFIL", query: "XFIL_RTE", customer: "A", …} ...
知道为什么吗?
答案 0 :(得分:0)
您没有提到您使用的Angular / Rxjs版本。因此,假设您所使用的版本中存在distinct
,那么问题是,当您进行区分时,您将检查一个可观察的对象是否与众不同,即,如果新的可观察值与旧值完全相同,则不发出任何东西。 here解释了基本概念。
您要做的实际上是从实际数组对象中删除重复项的基本操作。为此,您将需要编写自己的逻辑。
答案 1 :(得分:0)
我的猜测是您不是单独传递值,而是一次传递所有值。
说您的distinctBooks
数据是一个数组。如果将其传递给distinct,则其name
属性为undefined
。因此,即使您以后更改了内容,它的名称仍将是undefined
(因为它只是一个数组,所以通常不给它们命名)。
distinct
distinct
想要一个发射值数组,而不是单个值。我认为类似这样的方法对您有用(假设您的组件很多):
this.settingsService.getGuruQueries().subscribe(queries => {
from<any>(queries).pipe(distinct((p: any) => p['book']), ).subscribe(x => console.log(x));
请注意,我使用的是from
而不是您的of
。
一种替代方法是,通常仅从books数组中简单过滤唯一值,而无需在那里的可观察值:
this.settingsService.getGuruQueries().pipe(map(queries => Array.from(new Set(queries ))))
.subscribe();
请参见示例here。
注意:在您的示例中您要嵌套订阅。您可以在此处使用pipe/map
来避免它(忽略示例不起作用的事实):
this.settingsService.getGuruQueries()
.pipe(
map(queries =>
of<any>(queries).pipe(distinct((p: any) => p['book']))
)
.subscribe(x => console.log(x));