Добавить дополнительное свойство в массив Observable на основе другого массива - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть два типа наблюдаемых массивов Observable<MyType>

export interface MyType{
  title: string;
  id: string;
  other: [];
}

Я хочу добавить дополнительное свойство exists к первому массиву и установить его на true, если элемент существует во второммассив:

  const combined$ = combineLatest(this.first$, this.second$);
    this.output$ = combined.pipe(
      map((x, y) => {
        return x.map(a => {
          a.title = a.title;
          a.id = a.id;
          a.other = a.other;
          a.exists = y.find(b => b.id === a.id )
        });
      })
    );

Всегда получается [...undefined] результат при подписке на output наблюдаемую this.output$.subscribe(console.log);

Есть идеи, как исправить?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

В вашем фрагменте кода есть опечатка, в которой вы устанавливаете результат из оператора комбинированного последнего rxjs как combined$, затем вы называете его как combined в следующей строке, которая, как я полагаю, неверна, или просто ошибка перевода, когдапереходя эту проблему к SO.(независимо от того, должны указать на это хе-хе)

Далее оператор combineLatest возвращает массив всех наблюдаемых.Таким образом, вы можете легко получить последние значения из всех наблюдаемых с помощью деструктурирования в операторе map.

Ниже приведен окончательный код:

const combined$ = combineLatest(this.first$, this.second$);
this.output$ = combined.pipe(
  map(([x, y]) => {
    return x.map(a => {
      a.title = a.title;
      a.id = a.id;
      a.other = a.other;
      a.exists = y.find(b => b.id === a.id )
    });
  })
);

В исходном кодеВы по существу передавали массив значений как x.

0 голосов
/ 05 февраля 2019

Обратите внимание, что find возвращает элемент, найденный в массиве (в противном случае undefined ).Лучше использовать some.Кроме того, когда вы возвращаете объект на карте, вы должны использовать либо обычный оператор return, либо объект, заключенный в скобки.

const combined$ = combineLatest(this.first$, this.second$);
this.output$ = combined.pipe(
    map(([x, y]) => {
        return x.map(a => {
            return { 
                ...a,
                exists: y.some(b => b.id === a.id)
            };
         });
     })
);
0 голосов
/ 05 февраля 2019

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

Используйте ([x, y]), чтобы разрушить значения внутри карты и попробуйте снова.У объединенного $ также есть опечатка, которую вы пропустили.И find можно заменить на some, чтобы лучше представить логику и вернуть логическое значение

Также, когда вы используете x.map, вы логически отображаете неправильный массив.

const combined$ = combineLatest(this.first$, this.second$);
this.output$ = combined$.pipe(
  map(([x, y]) => {
    return x.map(a => {
      a.title = a.title;
      a.id = a.id;
      a.other = a.other;
      a.exists = y.some(b => b.id === a.id )
    });
  })
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...