如何按年份分组日期对象数组并计算同组末值减初值的差值
按年份分组计算年末y值减年初y值的实现方案
你当前的问题是累加逻辑不符合要求,要实现最后一条y值 - 第一条y值的计算,需要在分组时先存储同一年份的首尾y值,最后再计算差值。
修改后代码(兼容原数组倒序场景)
假设你提供的示例数组顺序固定为时间倒序,可直接使用以下代码:
function group_by_year(arr) { const yearGroup = arr.reduce((acc, { x: date_string, y: value }) => { const { year } = get_date_parts(date_string); if (!acc[year]) { // 首次命中该年份,当前值为年份最晚时间的y值 acc[year] = { label: year, lastY: value, firstY: value } } else { // 后续命中同一年份,更新为更早时间的y值 acc[year].firstY = value } return acc }, {}) // 计算每组差值得到最终结果 return Object.values(yearGroup).map(item => ({ label: item.label, value: item.lastY - item.firstY })) }
通用兼容代码(不限制原数组时间顺序)
如果不能保证原数组的时间排序,建议在分组时对比时间戳,准确取同一年的最早和最晚时间对应的y值:
function group_by_year(arr) { const yearGroup = arr.reduce((acc, { x: date_string, y: value }) => { const date = new Date(date_string) const year = date.getUTCFullYear().toString() const curTimestamp = date.getTime() if (!acc[year]) { acc[year] = { label: year, minTimestamp: curTimestamp, maxTimestamp: curTimestamp, minY: value, maxY: value } return acc } // 更新最早时间对应y值 if (curTimestamp < acc[year].minTimestamp) { acc[year].minTimestamp = curTimestamp acc[year].minY = value } // 更新最晚时间对应y值 if (curTimestamp > acc[year].maxTimestamp) { acc[year].maxTimestamp = curTimestamp acc[year].maxY = value } return acc }, {}) return Object.values(yearGroup).map(item => ({ label: item.label, value: item.maxY - item.minY })) }
以上代码运行后得到的结果和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者Dev M
相关产品推荐
相关产品推荐

