繁体   English   中英

RxJS映射数组与另一个可观察值和返回数组

[英]RxJS map array with another observables and return array

我有一些来自服务器的选项

const options = [
  {key: 1, label: 'label1'},
  {key: 2, label: 'label2'},
  {key: 3, label: 'label3'},
  {key: 4, label: 'label4'},
  {key: 5, label: 'label5'},
  {key: 6, label: 'label6'},
];

我需要的是根据每个key将每个key转换为映射key并返回已转换选项的数组

const options = [
  {key: "key1", label: 'label1', translated: 'translation 1'},
  {key: "key2", label: 'label2', translated: 'translation 2'},
  {key: "key3", label: 'label3', translated: 'translation 3'},
  {key: "key4", label: 'label4', translated: 'translation 4'},
  {key: "key5", label: 'label5', translated: 'translation 5'},
  {key: "key6", label: 'label6', translated: 'translation 6'},
];

我设法使用from(options)做到了这一点from(options)但显然它单独发出了数组的每个成员-我需要完整的数组。 在下面的代码中,我尝试压缩所有翻译,但仅收到翻译后的字符串数组-如何将它们映射回每个option

import { of, from, timer, zip } from 'rxjs';
import { map, mergeMap } from 'rxjs/operators';

const getTranslation = (key) => of('translation ' + key)

const options = [
  { key: "key1", label: 'label1' },
  { key: "key2", label: 'label2' },
  { key: "key3", label: 'label3' },
  { key: "key4", label: 'label4' },
  { key: "key5", label: 'label5' },
  { key: "key6", label: 'label6' },
];

of(options).pipe(
  mergeMap(options =>
    zip(...options.map(option =>
      getTranslation(option.key)))
  )).subscribe(console.log);

在这里,我在stackblitz上创建了一个游乐场

您可以将每个选项映射到一个Observable,然后forkJoin将它们全部加入:

forkJoin(options.map(options =>
  getTranslation(option.key).pipe(map(translation => ({
    ...option,
    translated: translation
  })))
)).subscribe(console.log);

使用传播和休息( ... )收集然后重新传播对象的其余部分:

zip(...options.map(({ key, ...option }) => ({ ...option, key: getTranslation(key) })))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM