如何将扁平JSON结构重组为按年份嵌套的数组结构?
按年份分组聚合JSON数据的实现方案
这事儿其实不难,核心就是把数据按年份分组再整理格式就行,我给你用两种常用语言写个示例,你一看就懂:
JavaScript 实现
用数组的reduce方法就能高效完成分组,它天生适合这种累积聚合的场景:
// 你的原始数据 const originalData = [ {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: "2020", Month: "1", Value: "214"}, {Id: "1", Id2: "1", Year: "2020", Month: "2", Value: "-41123"} ]; // 分组并转换格式 const groupedData = Object.entries( originalData.reduce((acc, item) => { // 如果当前年份还没在累加对象里,初始化一个空数组 if (!acc[item.Year]) { acc[item.Year] = []; } // 补零处理月份,然后把需要的字段加入对应年份的数组 acc[item.Year].push({ Month: item.Month.padStart(2, '0'), // 把"1"转成"01" Value: item.Value }); return acc; }, {}) // 初始值是空对象,用来存年份和对应数据 ).map(([Year, data]) => ({ Year, data })); // 把键值对转换成你要的数组结构 console.log(groupedData);
关键细节:
reduce负责遍历原始数据,把相同年份的条目归到同一组padStart(2, '0')确保月份始终是两位数字,解决单月份的格式问题- 最后用
Object.entries+map把分组后的对象转换成你需要的数组格式
Python 实现
如果用Python的话,collections.defaultdict能简化分组操作:
# 原始数据 original_data = [ {"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": "2020", "Month": "1", "Value": "214"}, ] from collections import defaultdict # 初始化分组字典,键是年份,值是对应的数据列表 grouped_dict = defaultdict(list) for item in original_data: # 用f-string格式化月份,补零到两位 formatted_month = f"{item['Month']:02d}" grouped_dict[item['Year']].append({ "Month": formatted_month, "Value": item['Value'] }) # 转换成目标数组格式 grouped_data = [{"Year": year, "data": data} for year, data in grouped_dict.items()] print(grouped_data)
核心思路:
不管用哪种语言,步骤都是一样的:
- 按年份分组:把相同年份的条目归类到一起
- 整理字段格式:处理月份补零,只保留需要的
Month和Value字段 - 转换结构:把分组后的结果转换成你要求的数组嵌套格式
内容的提问来源于stack exchange,提问作者Fishrage_
相关产品推荐
相关产品推荐

