You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按年份分组日期对象数组并计算同组末值减初值的差值

按年份分组计算年末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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:45:05