将对象转换为对象数组

convert object to array of object

我有这样来自后端的数据:

 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 = [
  {
    schedule: value,
    kubikasi: value,
    status_so: true
  },
  {
    schedule: value,
    kubikasi: value,
    status_so: false
  },
]

基本上我想将 json 从后端格式化为对象数组,并且我想根据预期结果对其进行分组。例如 api 中的 schedule 等数据可以是动态的,例如 schedule6.

我已经尝试过的

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,
          });
        }

您可以将对象的条目缩减为 Map。对于每个条目,获取密钥和数字 (idx) 。如果没有数字,则通过返回累加器(地图)来跳过。如果 idx 存在,add/update Map 中的对象:

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)

根据编号对对象的所有条目进行分组,减少为数组的数组。然后映射到对象数组。

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)