Исправить уменьшение в консоли - PullRequest
0 голосов
/ 01 ноября 2018

Я использовал для объединения двух наблюдаемых в одну, а затем получал единственные уникальные значения, поэтому после:

const latest = combineLatest(...queryResults, (...arrays) => arrays.reduce((
  acc: any,
  array: any
) => [...acc, ...array], []));

У меня есть массив с:

0: {id: "id1", categories: Array(1), value: "Stadium"}
1: {id: "id2", categories: Array(2), value: "ball"}
2: {id: "id3", categories: Array(2), value: "ball"}
3: {id: "id4", categories: Array(1), value: "Woman"}
4: {id: "id5", categories: Array(2), value: "head"}

и после

return latest.pipe(
  map(words => {
    return words.reduce((unique, o) => {
      if (!unique.some(obj => obj.id === o.id)) {
        unique.push(o);
      }
      return unique;
    }, []);
  })
);

результат:

0: {id: "id1", categories: Array(1), value: "Stadium"}
1: {id: "id2", categories: Array(2), value: "ball"}
2: {id: "id4", categories: Array(1), value: "Woman"}
3: {id: "id5", categories: Array(2), value: "head"}

и все в порядке. Работает нормально. Мой вопрос связан с ошибкой консоли:

ERROR in src/app/core/services/learning.service.ts(137,22): error TS2339: Property 'reduce' does not exist on type '{}'.

Строка 137 -> return words.reduce ((уникально, o) => {...

Как это исправить?

1 Ответ

0 голосов
/ 01 ноября 2018

По сути, это операция с массивом, но с помощью rxjs ее можно упростить с помощью distinctUntilKeyChange, но перед тем, как применить ее, сначала вам нужно объединить наблюдаемый массив результатов, см. Ниже

import { Component, OnInit } from '@angular/core';
import { of, combineLatest } from 'rxjs'; 
import { map,toArray,switchMap,tap,distinctUntilKeyChanged  } from 'rxjs/operators';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
  observables = []

  ob1 = of([
    {id: "id1", categories: Array(1), value: "Stadium"},
    {id: "id2", categories: Array(2), value: "ball"}
  ])

  ob2 = of([
    {id: "id2", categories: Array(2), value: "ball"},
    {id: "id4", categories: Array(1), value: "Woman"},
    {id: "id5", categories: Array(2), value: "head"}
  ])

  public ngOnInit(): void {
    this.observables.push(this.ob1);
    this.observables.push(this.ob2);

    const latest = combineLatest(...this.observables).pipe(switchMap((arr)=>{
return arr.reduce((acc,curr)=>acc.concat(curr),[])
    }));

const result = latest.pipe(
     distinctUntilKeyChanged("id"),toArray()
    );

    result.subscribe(words => {
      console.warn(words);
    })
  }
}
...