我正在解析一个结构如下的json:
"records": [
{
"timestamp": "1604133302",
"state": "Andhra Pradesh",
"district": "Anantapur",
"market": "Rayadurg",
"commodity": "Maize",
},
{
"timestamp": "1604133302",
"state": "Andhra Pradesh",
"district": "Chittor",
"market": "Chittoor",
"commodity": "Maize",
},
....
]
并且这是我试图解析为对象的代码,我想以html的可选部分显示它们,人们可以选择州和城市以及所有这些对象:
jsonFile.records.forEach(function (s) {
let { state, district, market, commodity } = s;
// states[state] = district;
// states[state][district] = market
// states[state][district][market] = commodity;
states[state] = {
[district]: {
[market]: [
[commodity],
]
}
};
});
它将替换最近的更新。
如何正确解析。
我想要的对象结构是这样的:
{
"myState":{
"myDistrict":{
"myMarket":[
"commoditynames"
],
"myMarketAnother":[
"commoditynames"
]
},
"myDistrictAnother":{
"myMarket":[
"commoditynames"
],
"myMarketAnother":[
"commoditynames"
]
}
}
}
我如何正确解析呢?
答案 0 :(得分:1)
您只需要将结果推入而不替换为最终商品数组即可。
我们可以使用.reduce()
,我们可以遍历数组的每个元素并可以保持结果的最终状态。进一步了解Array.prototype.reduce()
。
在每次迭代中,我们使用空对象/数组初始化result
,然后最终推送所需的数据。
function fixJSONStructure(records = {}) {
return records.reduce((result, record) => {
let { state, district, market, commodity } = record;
// initialize with empty object
if (!result[state]) result[state] = {};
if (!result[state][district]) result[state][district] = {};
if (!result[state][district][market]) result[state][district][market] = [];
// pushing a commodity instead of replacing
result[state][district][market].push(commodity);
return result;
}, {});
}
records = [
{
"timestamp": "1604133302",
"state": "Andhra Pradesh",
"district": "Anantapur",
"market": "Rayadurg",
"commodity": "Maize",
},
{
"timestamp": "1604133302",
"state": "Andhra Pradesh",
"district": "Anantapur",
"market": "Rayadurg",
"commodity": "something else",
},
{
"timestamp": "1604133302",
"state": "Andhra Pradesh",
"district": "Chittor",
"market": "Chittoor",
"commodity": "Maize",
},
{
"timestamp": "1604133302",
"state": "Karnatka",
"district": "Bangalore",
"market": "foobar",
"commodity": "baz",
},
];
console.log (fixJSONStructure(records));