У меня есть Firebase Firestore с «Компонентами» в качестве корневой коллекции. Каждый документ («Компонент») в коллекции может иметь массив, называемый «потомками», причем каждый элемент в массиве является «идентификатором» другого компонента, по сути, отношения «один ко многим». Поскольку каждый дочерний элемент также является компонентом, он также может иметь своих собственных дочерних элементов и т. Д.
Коллекция компонентов
Родитель
1_Parent (document)
│ name: 'Parent'
│ id: '1_Parent'
└─children (array)
├─1.1_Child_one
└─1.2_Child_two
Первый ребенок
1.1_Child_one (document)
name: 'Child One'
id: '1.1_Child_one'
Второй ребенок
1.2_Child_two (document)
│ name: 'Child Two'
│ id: '1.2_Child_two'
└─children (array)
├─1.2.1_Grandchild_one
└─1.2.2_Grandchild_two
Первый внук
1.2.1_Grandchild_one (document)
name: 'Grandchild One'
id: '1.2.1_Grandchild_one'
Второй внук
1.2.2_Grandchild_two (document)
name: 'Grandchild Two'
id: '1.2.2_Grandchild_two'
В моем коде я хочу создать объект для каждого компонента, и если у него есть дочерний массив, то каждый идентификатор в массиве заменяется полноценным объектом, полученным из Firestore.
Дерево выходных объектов должно выглядеть так
1_Parent
│ name: 'Parent'
│ id: '1_Parent'
└─children
├─1.1_Child_one
│ name: 'Child One'
│ id: '1.1_Child_one'
└─1.2_Child_two
│ name: 'Child Two'
│ id: '1.2_Child_two'
└─children
├─1.2.1_grandhild_one
│ name: 'Grandchild One'
│ id: '1.2.1_grandhild_one'
└─1.2.2_grandhild_two
name: 'Grandchild Two'
id: '1.2.2_grandhild_two'
Выходной объект в формате JSON должен выглядеть следующим образом
{
"name": "Parent",
"id": "1_Parent",
"children": [
{
"name": "Child One",
"id": "1.1_Child_one"
},
{
"name": "Child Two",
"id": "1.2_Child_two",
"children": [
{
"name": "Grandchild One",
"id": "1.2.1_Grandchild_one"
},
{
"name": "Grandchild Two",
"id": "1.2.2_Grandchild_two"
}
]
}
]
}
Очевидно, нам здесь нужна рекурсия, но я совершенно не уверен, как создать рекурсивную функцию с использованием RxJS. Буду признателен за некоторые советы или пример кода для разрешения сделать это
Обратите внимание, я использую это в проекте Angular и использую AngularFire для доступа к Firebase-Firestore.