【问题标题】:How to get multiple fields from object? [duplicate]如何从对象中获取多个字段? [复制]
【发布时间】:2022-01-22 00:51:11
【问题描述】:

我有一个包含一些数据的 observable。

我还有一个获取 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: {...}
}

谢谢:)

【问题讨论】:

标签: angular typescript rxjs observable


【解决方案1】:

试试这个:

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 函数的最后一个返回值。

此外,reduce 函数使用了Advanced syntax of arrow function,它让我们优雅地返回一个字面量对象。

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

【讨论】:

  • 非常感谢您的帮助!它工作得很好,但第二个箭头功能对我来说有点难以理解:/ 会试着弄清楚
  • @desmondische 我在答案中添加了一些解释。
  • 谢谢!我真的很感激
【解决方案2】:

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

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

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

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

【讨论】:

  • 我希望这个方法是通用的。所以我可以传递不同的字段,即电子邮件、电话等。我不想指定属性。我希望使用 fieldNames 参数创建它们
猜你喜欢
  • 2012-10-31
  • 2013-05-31
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多