将对象转换为数组

Converting an object to an array

本文关键字:数组 转换 对象      更新时间:2023-09-26

我尝试使用Object.keys()来转换对象

var obj1={
    "jan": {
        "COAL": "25"
    },
    "feb": {
        "ROM": "50",
        "WASTE": "55"
    },
    "april": {
        "COAL": "60"
    }
}

var obj2=[
    {
        "month": "jan",
        "product": "COAL",
        "quantity": "25"
    },
    {
        "month": "feb",
        "product": "ROM",
        "quantity": "50"
    },
    {
        "month": "feb",
        "product": "WASTE",
        "quantity": "55"
    },
    {
        "month": "april",
        "product": "COAL",
        "quantity": "60"
    }
]

但是在中间失败了,因为我无法计算属性,例如在"feb"中有两个产品"ROM"answers"WASTE",但这可以增加到3或4。谁能就这个问题提出可行的解决办法?

这样做:

var res = []
for(i in obj1){
 var rowObj = obj1[i];
 for(j in rowObj){
     var newObj = {'month' : i, 'product' : j, 'quantity' : rowObj[j]}
     res.push(newObj);
 }
}
console.log(res);

您需要在外部对象中遍历键,然后在内部对象中遍历键,因此只要您可以依赖ES5 Array方法:

var obj1={
    "jan": {
        "COAL": "25"
    },
    "feb": {
        "ROM": "50",
        "WASTE": "55"
    },
    "april": {
        "COAL": "60"
    }
}
var o = Object.keys(obj1).reduce(function(acc, month, i) {
  Object.keys(obj1[month]).forEach(function(product) {
    acc.push({'month':month, 'product':product, 'quantity':obj1[month][product]})
  });
  return acc;
}, []);
document.write(JSON.stringify(o));

使用ES6的箭头函数,它变得更加简洁:

var o = Object.keys(obj1).reduce((acc, m) => {
  Object.keys(obj1[m]).forEach(p => acc.push({'month':m, 'product':p, 'quantity':obj1[m][p]}));
  return acc;
}, []);