Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将两个可观测项转换为另一个可观测对象,并映射两个初始可观测值?_Javascript_Rxjs - Fatal编程技术网

Javascript 如何将两个可观测项转换为另一个可观测对象,并映射两个初始可观测值?

Javascript 如何将两个可观测项转换为另一个可观测对象,并映射两个初始可观测值?,javascript,rxjs,Javascript,Rxjs,这些是输入可观测值: items$ = of([ {name: 'John', age: 30, job: 'Dentist', address: {street: 'Maple (6,103)', country: 'US'}, {name: 'Mark', age: 34, job: 'Driver', address: {street: 'Pine (6,170)', country: 'US'}}, {name: 'Johannes', age: 25, job: 'Mech

这些是输入可观测值:

items$ = of([
  {name: 'John', age: 30, job: 'Dentist', address: {street: 'Maple (6,103)', country: 'US'},
  {name: 'Mark', age: 34, job: 'Driver', address: {street: 'Pine (6,170)', country: 'US'}},
  {name: 'Johannes', age: 25, job: 'Mechanic', address: {street: 'Elm (5,233)', country: 'US'}},
  {name: 'Thjoma', age: 28, job: 'Coder', address: {street: 'Lake (4,901)', country: 'US'}},
])

fields$ = of([
  name, age, street
])

如何将上述可观察字段映射到每个项目的新对象并返回新数组

预期结果:

of([
  {name: 'John', age: 30, job: 'Dentist', street: 'Maple (6,103)'},
  {name: 'Mark', age: 34, job: 'Driver', street: 'Pine (6,170)'},
  {name: 'Johannes', age: 25, job: 'Mechanic', street: 'Elm (5,233)'},
  {name: 'Thjoma', age: 28, job: 'Coder', street: 'Lake (4,901)'},
])
请参见内部项目(街道)已映射/展平,以获取每个项目的新对象

我试过这样的方法: 但它不起作用

    return combineLatest(
      this.items$,
      this.fields$,
      (items, fields) => ({ items, fields })
    ).pipe(
      map(({ items, fields }) =>
        fields.reduce(
          (acc, cur) => ({ ...acc, [cur]: items.map((item) => item[cur]) }),
          {}
        )
      )
    );
有人能帮忙吗

看到了吗

只有来自observable fields$的字段出现在结果observable中。
其他的都省略了。

类似的方法可能会奏效:

当然,它只适用于源数据中存在的字段名。在您的情况下,
street
将不起作用,因为您的对象没有
street
属性。您想挖掘出
address.street
属性,因此您需要做一些工作才能使其正常工作

如果您想用点来指定字段名以表示嵌套属性(例如
address.street
),可以这样做:


注意:如果您担心重复的字段名,您需要更详细一些。

类似的方法可能会奏效:

当然,它只适用于源数据中存在的字段名。在您的情况下,
street
将不起作用,因为您的对象没有
street
属性。您想挖掘出
address.street
属性,因此您需要做一些工作才能使其正常工作

如果您想用点来指定字段名以表示嵌套属性(例如
address.street
),可以这样做:


注意:如果您担心重复的字段名,您需要更详细一些。

您真的需要字段列表作为可观察的吗?这不只是一组感兴趣的领域吗?如果是这样的话,请使用直接的
map()
和固定(或可变但不可观察)字段集。您真的需要字段列表作为可观察字段吗?这不只是一组感兴趣的领域吗?如果是这样,请使用简单的
map()
和固定(或变化但不可见)字段集。
const $specifiedFieldsOnly = combineLatest(this.items$, this.fields$).pipe(
  map(([items, fields]) => 
    items.map(item => (
      fields.reduce((obj, field) => ({ ...obj, [field]:item[field] }), {}))
    )
  )
);
const fields$ = of([
  'name', 'age', 'address.street', 'address.country'
]);

const $specifiedFieldsOnly = combineLatest(this.items$, this.fields$).pipe(
  map(([items, fields]) => 
    items.map(item => (
      fields.reduce((obj, path) => {
        const field = path.split('.').reduce(
          (acc, cur, i) => { 
            const name = cur;
            const value = (i === 0) ? item[cur] : acc.value[cur];

            return { name, value };
          },
          { name: undefined, value: undefined }
        );

        return { ...obj, [field.name]: field.value };

      }, {}))
    )
  )
);