Сравните два наблюдаемых значения и верните результат в массив - Angular Rxjs - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь сравнить два наблюдаемых метода и вернуть результат. Я попробовал пример, но не получил ожидаемый результат. Я надеюсь, что следующий пример (что я пробовал) прояснит вопрос.

GetCountries() : Observable<any>
{
  return this.http.GetCountries().subscribe(data => {
    return  data;
  })
}

GetSelectedCities() : Observable<any>
  {
    return this.http.GetCities().map(data => {
      return   data
    });

  }

let cities = [{name:'new york', id:1},
    {name:'paris', id:2},
    {name:'london', id:3}]

    let countries = [{name:'usa', id:1, city:'new york'},
    {name:'germany', id:2,city:'berlin'},
    {name:'france', id:3,city:'marseille'},
    {name:'netherland', id:3,city:'amersterdam'}]

GetNotSelectedCities()
{
  this.GetCountries.do(data => {
    this.GetSelectedCities.do(response => {
      data.filter(x=> return response.filter(d=> d.city !== x.name ) )
    })
  })
}

Но вместо этого результата я получаю список городов:

[{name:'germany', id:2,city:'berlin'},
    {name:'france', id:3,city:'paris'},
    {name:'netherland', id:3,city:'amersterdam'}]

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Попробуйте это:

GetNotSelectedCities() {
   forkJoin([
      this.GetCountries(),
      this.GetSelectedCities(),
   ])
   .pipe(
       map(([countries, cities]) => {
          return countries.filter(country => !cities.find(c => c.name === country.city));
       })
   )
   .subscribe(notSelected => {
      console.log(notSelected);
   });
}
0 голосов
/ 27 февраля 2020

В качестве альтернативы:

GetCountries() : Observable<any>
{
  return this.http.GetCountries();
}

GetSelectedCities() : Observable<any>
  {
    return this.http.GetCities();

  }

let cities = [{name:'new york', id:1},
    {name:'paris', id:2},
    {name:'london', id:3}]

    let countries = [{name:'usa', id:1, city:'new york'},
    {name:'germany', id:2,city:'berlin'},
    {name:'france', id:3,city:'marseille'},
    {name:'netherland', id:3,city:'amersterdam'}]

GetNotSelectedCities()
{
   return combineLatest([this.GetCountries(), this.GetSelectedCities()]).pipe(map([countries, cities]) => {
    return countries.filter(country => cities.filter(d=> d.city !== country.name ).length > 0 );
}))
}

Это, однако, потребует от вас подписаться на это везде, где вы хотите использовать этот комбинат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...