繁体   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