[英]How can I group by multiple fields?
我有這個數組:
[ {
id_base: 2,
nombre_base: 'Hayama',
nombre_flota: 'Browseblab',
matricula: '#b65e9e',
id_vehiculo: 3
}, {
id_base: 2,
nombre_base: 'Hayama',
nombre_flota: 'Browseblab',
matricula: '#b65e9e',
id_vehiculo: 3
}, {
id_base: 2,
nombre_base: 'Hayama',
nombre_flota: 'Browseblab',
matricula: '#a606f8',
id_vehiculo: 4
}, {
id_base: 1,
nombre_base: 'Cabitan',
nombre_flota: 'Browseblab',
matricula: '#8f72c2',
id_vehiculo: 1
}, {
id_base: 1,
nombre_base: 'Cabitan',
nombre_flota: 'Browseblab',
matricula: '#8f72c2',
id_vehiculo: 1
}]
我希望它像這樣分組:
[{
id_base: 2,
nombre_base: 'Hayama',
nombre_flota: 'Browseblab',
[{
matricula: '#b65e9e',
id_vehiculo: 3
}, {
matricula: '#a606f8',
id_vehiculo: 4
}]
}, {
id_base: 1,
nombre_base: 'Cabitan',
nombre_flota: 'Browseblab',
[{
matricula: '#8f72c2',
id_vehiculo: 1
}, {
matricula: '#8f72c2',
id_vehiculo: 1
}]
}]
我試過這個:
let agrupadoBases = result.reduce((group, linea) => {
const { id_base } = linea
group[id_base] = group[id_base] ?? []
delete linea.id_base
group[id_base].push(linea)
return group
}, {})
但它只將 id_base 與 rest 分開
{ '1': [ RowDataPacket { nombre_base: 'Cabitan', nombre_flota: 'Browseblab', matricula: '#8f72c2', id_vehiculo: 1 }, ], '2': [ RowDataPacket { nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#b65e9e', id_vehiculo: 3 }, RowDataPacket { nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#a606f8', id_vehiculo: 4 } ] }
它並不完美,但可以完成工作。
我創建了一個空的 object 和我 go 通過數據數組中的每個 object。 如果具有相同id_base
的 object 出現在最終的 object 中,我只需要 append 另一個子數組。 如果 object 還不存在,我將它與一些初始數據一起推入數組。
const data = [{ id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#b65e9e', id_vehiculo: 3 }, { id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#b65e9e', id_vehiculo: 3 }, { id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#a606f8', id_vehiculo: 4 }, { id_base: 1, nombre_base: 'Cabitan', nombre_flota: 'Browseblab', matricula: '#8f72c2', id_vehiculo: 1 }, { id_base: 1, nombre_base: 'Cabitan', nombre_flota: 'Browseblab', matricula: '#8f72c2', id_vehiculo: 1 }]; const expected = [{ id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', someUnknownKey: [{ matricula: '#b65e9e', id_vehiculo: 3, }, { matricula: '#a606f8', id_vehiculo: 4 } ] }, { id_base: 1, nombre_base: 'Cabitan', nombre_flota: 'Browseblab', someUnknownKey: [{ matricula: '#8f72c2', id_vehiculo: 1 }, { matricula: '#8f72c2', id_vehiculo: 1 } ], }]; let mappedData = []; data.forEach((v) => { const parentIndex = mappedData.findIndex((mappedDataEntry) => mappedDataEntry.id_base === v.id_base); if (parentIndex === -1) { mappedData.push({ id_base: v.id_base, nombre_base: v.nombre_base, nombre_flota: v.nombre_flota, someUnknownKey: [{ matricula: v.matricula, id_vehiculo: v.id_vehiculo }] }); return; } const newItem = { matricula: v.matricula, id_vehiculo: v.id_vehiculo }; mappedData[parentIndex] = {...mappedData[parentIndex], someUnknownKey: [...mappedData[parentIndex].someUnknownKey, newItem, ] } }); console.log(mappedData);
您可以分離外部屬性並將 rest 用於嵌套數據。
const data = [{ id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#b65e9e', id_vehiculo: 3 }, { id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#b65e9e', id_vehiculo: 3 }, { id_base: 2, nombre_base: 'Hayama', nombre_flota: 'Browseblab', matricula: '#a606f8', id_vehiculo: 4 }, { id_base: 1, nombre_base: 'Cabitan', nombre_flota: 'Browseblab', matricula: '#8f72c2', id_vehiculo: 1 }, { id_base: 1, nombre_base: 'Cabitan', nombre_flota: 'Browseblab', matricula: '#8f72c2', id_vehiculo: 1 }], result = Object.values(data.reduce((r, { id_base, nombre_base, nombre_flota, ...o }) => { r[id_base]??= { id_base, nombre_base, nombre_flota, data: [] }; r[id_base].data.push(o); return r; }, {})); console.log(result);
.as-console-wrapper { max-height: 100%;important: top; 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.