如何将两个可观察项目转换为另一个具有两个初始可观察量映射值的可观察对象?



这些是输入可观察量:

items$ = of([
{name: 'John', age: 30, job: 'Dentist', address: {street: 'Maple (6,103)', country: 'US'},
{name: 'Mark', age: 34, job: 'Driver', address: {street: 'Pine (6,170)', country: 'US'}},
{name: 'Johannes', age: 25, job: 'Mechanic', address: {street: 'Elm (5,233)', country: 'US'}},
{name: 'Thjoma', age: 28, job: 'Coder', address: {street: 'Lake (4,901)', country: 'US'}},
])
fields$ = of([
name, age, street
])

如何将上面的可观察量字段映射到每个项目的新对象并返回新数组?

预期成果:

of([
{name: 'John', age: 30, job: 'Dentist', street: 'Maple (6,103)'},
{name: 'Mark', age: 34, job: 'Driver', street: 'Pine (6,170)'},
{name: 'Johannes', age: 25, job: 'Mechanic', street: 'Elm (5,233)'},
{name: 'Thjoma', age: 28, job: 'Coder', street: 'Lake (4,901)'},
])

看到内部项目(街道(被映射/展平以获得每个项目的新对象。

我已经尝试过这样的东西: 但它不起作用。

return combineLatest(
this.items$,
this.fields$,
(items, fields) => ({ items, fields })
).pipe(
map(({ items, fields }) =>
fields.reduce(
(acc, cur) => ({ ...acc, [cur]: items.map((item) => item[cur]) }),
{}
)
)
);

有人可以帮忙吗?

看到那个

只有可观察字段 $ 中的字段才会出现在生成的可观察量中。 其他的则省略。

这样的东西可以工作:StackBlitz

const $specifiedFieldsOnly = combineLatest(this.items$, this.fields$).pipe(
map(([items, fields]) => 
items.map(item => (
fields.reduce((obj, field) => ({ ...obj, [field]:item[field] }), {}))
)
)
);

当然,它仅适用于源数据中存在的字段名称。 在您的情况下street将不起作用,因为您的对象没有street属性。 你想挖出address.street属性,所以你有一些工作要做才能完成这项工作。

如果您想用点指定字段名称来表示嵌套属性(例如address.street(,这可以工作:StackBlitz

const fields$ = of([
'name', 'age', 'address.street', 'address.country'
]);
const $specifiedFieldsOnly = combineLatest(this.items$, this.fields$).pipe(
map(([items, fields]) => 
items.map(item => (
fields.reduce((obj, path) => {
const field = path.split('.').reduce(
(acc, cur, i) => { 
const name = cur;
const value = (i === 0) ? item[cur] : acc.value[cur];
return { name, value };
},
{ name: undefined, value: undefined }
);
return { ...obj, [field.name]: field.value };
}, {}))
)
)
);

注意:如果您担心重复的字段名称,则需要更详细一点。

最新更新