如何从对象中获取多个字段?

How to get multiple fields from object?

我有一个包含一些数据的可观察对象。

我还有一个获取 1 个特定字段的方法:

getField(fieldName: string) {
 return this.response$.asObservable().
  pipe(
    map(data => data[fieldName]),
    take(1)
  )
} 

------------------------------------------------

getFirstNameGroup(): Observable<any> {
   return this.service.getField('first_name'); // returns current field's properties as an object
}

我不仅要传递一个字段名称,还要传递许多字段名称,如下所示:

getFields(fieldNames: string[]) {
 return this.response$.asObservable().
  pipe(
    map(data => fieldNames.map(field => data[field])),
    take(1)
  )
}

------------------------------------------------

getPersonName(): Observable<any> {
    // returns an array of objects where indexes 0 and 1 are instead of first_name and last_name
    return this.service.getFields(['first_name', 'last_name']); 
}

我只是想不出我应该在 map() 中更改什么才能得到一个类似于(或类似这样的东西)的对象:

{
  first_name: {...},
  last_name: {...}
}

谢谢:)

您可以使用对象文字语法。像这样:

map(data => ({
  first_name: data.fs,
  last_name: data.ls
}))

或者如果您更喜欢在对象上索引字段

map(data => ({
  first_name: data[fs]
  last_name: data[ls]
}))

试试这个:

map(data => fieldNames.reduce((prev, curr) => ({...prev, [curr]: data[curr]}), {} as any)),

解释:

假设 fieldNames 数组看起来像这样 ['first_name', 'last_name', 'phone_no'] 那么现在每次迭代会发生什么?

在每次迭代中,我们使用扩展运算符将 prev 下保存的先前值与一个新的 属性.

合并

#1迭代

({ ...{}, 'first_name': data['first_name'] })

等于

{ 'first_name': {} }

prev 是作为最后一个参数传递给 reduce 函数的空 {}[curr] 语法让我们在对象中使用动态键,所以这只是转换为 'first_name' 因为这是 curr 此时的值。

#2迭代

({ ...{'first_name': {} }, 'last_name': data['last_name'] })

等于

{ 'first_name': {}, 'last_name': {} }

#3迭代

({ ...{ 'first_name': {}, 'last_name': {} }, 'phone_no': data['phone_no'] })

等于

{ 'first_name': {}, 'last_name': {}, 'phone_no': {} }

每次迭代 curr 获取 fieldNames 数组的下一个元素和 prev 来自 reduce 函数的最后一个 returned 值。

此外,对于 reduce 函数,使用了 Advanced syntax of arrow function,这让我们优雅地 return 一个文字对象。

为简单起见,我假设 data 是一个字典,其键类型为字符串,值类型为对象。我只将空对象作为占位符。