Tengo datos de backend como este:
const fetchResult = { cmo: 'integrated', schedule1: '2021-08-12', schedule2: '2021-09-20', kendaraan: {}, kubikasi1: 207000, kubikasi2: 20000, status_so1: true, status_so2: false, }
lo que esperaba :
const result = [ { schedule: value, kubikasi: value, status_so: true }, { schedule: value, kubikasi: value, status_so: false }, ]
Básicamente, quiero formatear json desde el backend hasta una matriz de objetos y quiero agruparlo, según el resultado esperado. y los datos, por ejemplo, como el schedule
de la API, pueden ser dinámicos como el schedule6
.
lo que ya probé
for (let i = 1; i <= 4; i++) { if (cmo["schedule_" + i]) { data.push({ schedule: cmo["schedule_" + i], namakendaraan: cmo["namakendaraan" + i], kendaraan: cmo["kendaraan" + i], totalCarton: cmo["totalCarton" + i], tonase: cmo["tonase_" + i], totalTonaseKendaraan: cmo["totalTonaseKendaraan" + i], totalPercentaseTonaseOrder: cmo["totalPercentaseTonaseOrder" + i], kubikasi: cmo["kubikasi_" + i], totalKubikasiKendaraan: cmo["totalKubikasiKendaraan" + i], totalPercentaseKubikasiOrder: cmo["totalPercentaseKubikasiOrder" + i], nomor_so: cmo["nomor_so_" + i], status_so: cmo["status_so_" + i], }); } else { data.push({ schedule: null, namakendaraan: null, kendaraan: null, totalCarton: null, tonase: null, totalTonaseKendaraan: null, totalPercentaseTonaseOrder: null, kubikasi: null, totalKubikasiKendaraan: null, totalPercentaseKubikasiOrder: null, nomor_so: null, status_so: null, }); }
Puede reducir las entradas del objeto a un mapa. Para cada entrada, tome la clave y el número ( idx
) . Si no hay número, omita devolviendo el acumulador (el Mapa). Si existe idx
, agregue/actualice el objeto en el Mapa:
const fetchResult = {"cmo":"integrated","schedule1":"2021-08-12","schedule2":"2021-09-20","kendaraan":{},"kubikasi1":207000,"kubikasi2":20000,"status_so1":true,"status_so2":false} const result = Array.from(Object.entries(fetchResult) .reduce((acc, [k, v]) => { const [key, idx = null] = k.split(/([0-9]+$)/) return idx === null ? acc : acc.set(idx, { ...acc.get(idx), [key]: v }) }, new Map()).values()) console.log(result)
Agrupe todas las entradas del objeto según el número, reduzca a una matriz de matriz de matriz. Luego asigne a una matriz de objetos.
const fetchResult = { cmo: 'integrated', schedule1: '2021-08-12', schedule2: '2021-09-20', kendaraan: {}, kubikasi1: 207000, kubikasi2: 20000,status_so1: true,status_so2: false,} const result = Object.entries(fetchResult).reduce((a,c)=>{ if(parseInt(c[0][c[0].length-1])>0){ const ind = parseInt(c[0][c[0].length-1])-1 const push = [c[0].substring(0,c[0].length-1),c[1]] !a[ind]?(a[ind]=[],a[ind].push(push)):a[ind].push(push) } return a },[]).map(el=>Object(Object.fromEntries(el))) console.log(result)