如何用JavaScript将含日期键的JSON文件按月份拆分
按月份拆分日期键JSON数据的正确实现
首先得指出你之前代码的两个核心问题:
- 你的
main是一个数组,里面才是包含日期键的对象,直接for(key in main)遍历的是数组的索引(比如0),而不是日期键; - 你用
jan.push(main[key], key)把键和值分别推入数组,得到的是扁平结构,但你需要的是保留键值对的对象,不是数组。
下面是正确的实现步骤(以Node.js环境为例,因为涉及写入文件):
步骤1:处理数据结构,按月份分组
首先我们需要把原数据里的日期键值对按月份归类到不同的对象中:
// 你的原始数据 const main = [{"2018-01-01":277,"2018-01-08":361, "2018-02-05":357,"2018-02-12":367, "2018-03-05":481,"2018-03-12":445, "2018-04-02":484,"2018-04-09":345}]; // 取出数组里的日期对象(因为main是数组包裹的对象) const dateData = main[0]; // 初始化每个月份的空对象,用来存对应月份的键值对 const monthlyData = { "2018-01": {}, "2018-02": {}, "2018-03": {} }; // 遍历日期对象的所有键 for (const dateKey of Object.keys(dateData)) { // 提取月份部分(比如"2018-01-01"取前7位得到"2018-01") const month = dateKey.substring(0, 7); // 如果当前月份在我们的目标分组里,就把键值对添加进去 if (monthlyData[month]) { monthlyData[month][dateKey] = dateData[dateKey]; } }
步骤2:将分组后的数据写入对应JSON文件
接下来我们可以用Node.js的fs模块把每个月份的对象写入单独的JSON文件:
const fs = require('fs').promises; // 用异步Promise版本更优雅 // 定义写入文件的函数 async function writeMonthlyFiles() { for (const [month, data] of Object.entries(monthlyData)) { // 把对象转换成格式化的JSON字符串 const jsonStr = JSON.stringify(data, null, 2); // 写入文件,文件名比如"2018-01.json" await fs.writeFile(`${month}.json`, jsonStr, 'utf8'); console.log(`已生成${month}.json文件`); } } // 执行写入操作 writeMonthlyFiles().catch(err => console.error('写入文件出错:', err));
最终效果
执行后你会得到三个文件:
2018-01.json内容:
{"2018-01-01":277,"2018-01-08":361}
2018-02.json内容:
{"2018-02-05":357,"2018-02-12":367}
2018-03.json内容:
{"2018-03-05":481,"2018-03-12":445}
如果是浏览器环境(不需要写文件),你可以直接使用monthlyData里的各个月份对象,比如monthlyData["2018-01"]就是1月的完整键值对数据。
内容的提问来源于stack exchange,提问作者road
相关产品推荐
相关产品推荐

