JSON解析为对象奇怪的结果吗?

时间:2020-10-31 12:23:44

标签: javascript node.js json object

我正在解析一个结构如下的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"
         ]
      }
   }
} 

我如何正确解析呢?

1 个答案:

答案 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));