Я хочу преобразовать ответ Loopback в табличные / сплющенные множественные массивы (например, ответ от соседнего запроса sql, а не loopback). Пример ввода:
let data = [{
id: 1,
type: "sedan",
vehicles: [{
id: 1,
name: 'audi',
tyres: [{
id: 1,
size: "40inch",
manufacturer: [{
id: 1,
name: "General",
branches: [{
id: "1",
city: "munich"
},
{
id: "2",
city: "cologne"
}
]
},
{
id: 2,
name: "Rosana",
branches: [{
id: "3",
city: "paris"
},
{
id: "4",
city: "venice"
}
]
}
]
},
{
id: 2,
size: "60inch",
manufacturer: [{
id: 1,
name: "General",
branches: [{
id: "1",
city: "munich"
},
{
id: "2",
city: "cologne"
}
]
}]
}
]
},
{
id: 2,
name: 'mercedes',
tyres: [{
id: 2
size: "60inch",
manufacturer: [{
id: 1,
name: "General",
branches: [{
id: "1",
city: "munich"
},
{
id: "2",
city: "cologne"
}
]
}]
}]
}
]
}]
Ожидаемый вывод:
expectedOutput = [{
"id": 1,
"type": "sedan",
"vehicles.id.": 1,
"vehicles.name": "audi",
"tyres.id": 1,
"tyres.size": "40inch",
"manufacturer.id": 1,
"manufacturer.name": "General",
"branches.id": 1,
"branches.city": "munich"
},
{
"id": 1,
"type": "sedan",
"vehicles.id.": 1,
"vehicles.name": "audi",
"tyres.id": 1,
"tyres.size": "40inch",
"manufacturer.id": 1,
"manufacturer.name": "General",
"branches.id": 2,
"branches.city": "cologne"
},
{
"id": 1,
"type": "sedan",
"vehicles.id.": 1,
"vehicles.name": "audi",
"tyres.id": 1,
"tyres.size": "40inch",
"manufacturer.id": 2,
"manufacturer.name": "Rosana",
"branches.id": 3,
"branches.city": "paris"
},
{
"id": 1,
"type": "sedan",
"vehicles.id.": 1,
"vehicles.name": "audi",
"tyres.id": 1,
"tyres.size": "40inch",
"manufacturer.id": 2,
"manufacturer.name": "Rosana",
"branches.id": 4,
"branches.city": "venice"
},
{
"id": 1,
"type": "sedan",
"vehicles.id.": 2,
"vehicles.name": "mercedes",
"tyres.id": 1,
"tyres.size": "60inch",
"manufacturer.id": 1,
"manufacturer.name": "General",
"branches.id": 1,
"branches.city": "munich"
},
{
"id": 1,
"type": "sedan",
"vehicles.id.": 2,
"vehicles.name": "mercedes",
"tyres.id": 2,
"tyres.size": "60inch",
"manufacturer.id": 1,
"manufacturer.name": "General",
"branches.id": 2,
"branches.city": "cologne"
}
]
Мой код выглядит следующим образом, но каким-то образом он перезаписывает данные при вызове рекурсии или при вызове плоской функции более одного раза (без рекурсии). Функция Flat пытается сгладить 1 строку / уровень при каждом вызове. Возможно, есть лучший рекурсивный подход, который я не смог достичь.
function flat(arr, result) {
arr.forEach(row => {
let rows = [];
keys = Object.keys(row);
keys.forEach(key => {
if (Array.isArray(row[key])) {
rows.push(...merge(rows, row[key], key));
} else {
rows.push(row);
}
})
result.push(...rows);
})
console.log(result);
// TODO
// flat(result, []);
// each call linerize each level,
//should be called untill the whole array is linearized
//
return result;
}
function merge(rows, arr, alias) {
if (!rows.length) {
rows = [{}]
}
let a = arr.map(row => {
keys = Object.keys(row);
keys.forEach(key => {
rows.forEach(r => {
if (Array.isArray(row[key])) {
r[key] = row[key];
} else {
r[alias + '.' + key] = row[key];
}
delete r[alias];
})
})
})
return a.filter(x=>{
if(x!== null){
return x;
}
});