簡體   English   中英

如何按多個字段分組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM