如何从对象中获取多个字段? [复制]
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 参数创建它们以上是关于如何从对象中获取多个字段? [复制]的主要内容,如果未能解决你的问题,请参考以下文章