首页 > 解决方案 > 将单个 JSON 重构为嵌套数组

问题描述

我有以下 JSON:

[
{Id: "1", Id2: "1", Year: "2019", Month: "1", Value: "123"},
{Id: "1", Id2: "1", Year: "2019", Month: "2", Value: "3"},
{Id: "1", Id2: "1", Year: "2019", Month: "3", Value: "-123"},
{Id: "1", Id2: "1", Year: "2019", Month: "4", Value: "-4123"},
...
{Id: "1", Id2: "1", Year: "2020", Month: "1", Value: "214"},
{Id: "1", Id2: "1", Year: "2020", Month: "2", Value: "-41123"},
{Id: "1", Id2: "1", Year: "2020", Month: "3", Value: "12344"},
{Id: "1", Id2: "1", Year: "2020", Month: "4", Value: "1232"}
]

我想变成这样:

[{ 
  Year : "2019",
    data : [{ 
      Month : "01",
      Value : "123"
    },{
      Month : "02",
      Value : "2223"
    }...
  },{
  Year : "2020",
    data: [{
       Month : "01",
       Value : "214"
    }...
}] 

不知道如何轻松做到这一点,似乎它现在超出了我的范围。

有人能指出我正确的方向吗?

非常感谢,

标签: javascriptjson

解决方案


尝试使用 Array.reduce

这是一个工作示例,假设同一月份/年份组合没有重复条目

var testData = [
{Id: "1", Id2: "1", Year: "2019", Month: "1", Value: "123"},
{Id: "1", Id2: "1", Year: "2019", Month: "2", Value: "3"},
{Id: "1", Id2: "1", Year: "2019", Month: "3", Value: "-123"},
{Id: "1", Id2: "1", Year: "2019", Month: "4", Value: "-4123"},
{Id: "1", Id2: "1", Year: "2020", Month: "1", Value: "214"},
{Id: "1", Id2: "1", Year: "2020", Month: "2", Value: "-41123"},
{Id: "1", Id2: "1", Year: "2020", Month: "3", Value: "12344"},
{Id: "1", Id2: "1", Year: "2020", Month: "4", Value: "1232"}
];

var reducedTestData = testData.reduce((acc, item) => {
	let itemData = {
    Month: item.Month,
    Value: item.Value
  };
	return Object.assign({}, acc, {
  	[item.Year]: acc.hasOwnProperty(item.Year) 
    	? Object.assign(
      	{}, 
        acc[item.Year], 
        {
        	data: acc[item.Year].data.concat(itemData) 
        }
      ) 
      : {data: [itemData]}
  });
}, {});

document.body.appendChild(document.createElement('pre')).innerHTML = JSON.stringify(reducedTestData, null, 2);


推荐阅读