如何从对象中获取多个字段? [复制]

Posted

技术标签:

【中文标题】如何从对象中获取多个字段? [复制]【英文标题】: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: ...

谢谢:)

【问题讨论】:

查看reduce而不是map ***.com/questions/38750705/… 感谢两位的提示! @munleashed,它有效,但 Lukasz Gawrys 的解决方案看起来更干净,我猜 :) 【参考方案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 参数创建它们

以上是关于如何从对象中获取多个字段? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

重放浏览器多个请求性能测试实践

如何使用可重复对象中的嵌套必填字段将数据从一个表复制到另一个表

如何使用流从对象列表中获取地图? [复制]

如何从 mongodb 获取的对象中删除键? [复制]

如何从 mongodb 获取的对象中删除键? [复制]

如何从 javascript 对象中获取值的键? [复制]