与众不同的使用

时间:2018-12-04 13:48:11

标签: json angular observable

我正在尝试通过在我的可观察范围内使用.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", …} ...

知道为什么吗?

2 个答案:

答案 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));