У меня есть новый блик стека, который работает, но он не выглядит как самый элегантный код: https://stackblitz.com/edit/angular-rg6q5d?file=src/app/data.component.ts
Я также изменил вывод, чтобы показать JSON до / после на экране:сделать немного легче увидеть, что я пытаюсь сделать (надеюсь). Кто-нибудь может дать представление о том, как сделать это лучше?
getRelationalData() {
let x = combineLatest(
this.parentData$,
this.assnData$,
this.childData$
).pipe(
map(([pData, aData, cData]) => {
return pData.map(p => {
// get assn objects for this parent
let assn = aData.filter(a => a.parentCode === p.parentCode);
// get kids for this parent based on assn object (filter undefined)
let kids = cData.map(c => this.mergeData(c, assn))
.filter(k => k !== undefined ) ;
// return a new parent with the newly created child objects
return {
...p,
kids: kids
}
})
})
//, tap(x => console.log(x))
)
return x;
}
mergeData(child, assnObs){
// filter the assn objects for each child
let assn = assnObs.find(a => a.childId === child.id);
// return undefined so it can be filtered later
if (assn === undefined){
return assn;
}
//return the child object with the appropriate statusCode
return Object.assign(
{},
child,
{
statusCode: assn.statusCode
}
)
}
Результирующий JSON - родительский и дочерний объекты правильно связаны друг с другом, и каждый дочерний элемент имеет соответствующий statusCode на основе родительского элемента:
[
{
"parentCode": "abc",
"name": "John",
"kids": [
{
"id": "123",
"name": "Billy",
"age": "10",
"statusCode": "tallest"
},
{
"id": "789",
"name": "Sue",
"age": "6",
"statusCode": "youngest"
}
]
},
{
"parentCode": "xyz",
"name": "Jane",
"kids": [
{
"id": "456",
"name": "Bobby",
"age": "8",
"statusCode": "something"
},
{
"id": "789",
"name": "Sue",
"age": "6",
"statusCode": "whatever"
}
]
}
]