如何将日期关联价格的JavaScript对象按月份分组?
按月份分组日期-价格对象并计算月度最低价
核心实现思路
通过遍历对象的键值对,提取每个日期的年月标识(如2022-09)作为分组键,使用reduce方法高效完成分组。这种方法只需一次遍历原对象,性能最优,适合处理超长数据,后续可直接基于分组结果计算每月最低价。
分组代码实现
const obj = { "2022-09-17": 45, "2022-09-18": 35, "2022-09-19": 34, "2022-09-20": 26, "2022-09-21": 25, "2022-09-22": 33, "2022-09-23": 56, "2022-09-24": 39, "2022-09-25": 49, "2022-09-26": 25, "2022-09-27": 25, "2022-09-28": 25, "2022-09-29": 33, "2022-09-30": 42, "2022-10-01": 28, "2022-10-02": 38, "2022-10-03": 35, "2022-10-04": 25, "2022-10-05": 25, "2022-10-06": 31 }; // 按月份分组为对象格式(键为年月,值为对应日期价格对) const groupedByMonth = Object.entries(obj).reduce((acc, [date, price]) => { // 提取前7位作为年月分组键 const monthKey = date.slice(0, 7); // 初始化月份组(不存在时创建空对象) if (!acc[monthKey]) acc[monthKey] = {}; // 将当前日期价格对加入对应月份组 acc[monthKey][date] = price; return acc; }, {}); // 转为数组格式(每个元素包含月份和对应数据),方便后续遍历 const groupedArray = Object.entries(groupedByMonth).map(([month, data]) => ({ month, data }));
分组结果说明
groupedByMonth:键为年月字符串(如2022-09),值为对应月份的所有日期-价格键值对对象。groupedArray:数组结构,每个元素包含month(年月标识)和data(对应月份的日期价格集合),更直观适合遍历操作。
计算每月最低价格
基于分组结果,直接遍历计算即可:
const monthlyMinPrices = Object.entries(groupedByMonth).map(([month, data]) => { // 提取当前月份所有价格值,取最小值 const minPrice = Math.min(...Object.values(data)); return { month, minPrice }; }); console.log(monthlyMinPrices); // 输出: // [ // { month: '2022-09', minPrice: 25 }, // { month: '2022-10', minPrice: 25 } // ]
方案优势
- 性能高效:仅一次遍历原对象完成分组,避免冗余循环,适配超长数据集。
- 原生兼容:使用JS原生方法实现,无需依赖第三方库,兼容性覆盖所有现代浏览器。
- 扩展性强:后续如需计算均价、最高价等指标,只需修改分组后的遍历逻辑即可。
内容的提问来源于stack exchange,提问作者Reena Verma
相关产品推荐
相关产品推荐

