如何从对象中获取多个字段?
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
是一个字典,其键类型为字符串,值类型为对象。我只将空对象作为占位符。
我有一个包含一些数据的可观察对象。
我还有一个获取 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
是一个字典,其键类型为字符串,值类型为对象。我只将空对象作为占位符。