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

d3.rollup返回空对象求助:传入JSON数据未得到预期值

问题分析与解决

你的代码返回[[null,{}]]的核心原因是日期字符串转数字的方式错误:+d.date会将"2000-01-01"这类ISO格式日期转为NaN,导致d3.rollup用NaN作为唯一分组键,后续new Date(NaN)得到的是无效日期(部分环境下会显示为null),同时分组后的结构完全不符合预期。

修复步骤

1. 修正分组键的日期处理

不要用+d.date转换日期,直接使用日期字符串作为分组键(性能更优),之后再统一转为Date对象即可。如果需要直接用Date对象作为分组键,也可以提前转换,但字符串分组在rollup中更高效。

2. 优化聚合函数(可选但更稳妥)

原代码中([d]) => d.value依赖每个(date, name)分组只有一个数据项,如果后续数据出现重复分组,会直接丢失数据。改用d3.sum来聚合值,即使同分组有多条数据也能正确计算总和。

修复后的代码

populateDateValues() {
  datevalues = Array.from(
    d3.rollup(
      data,
      v => d3.sum(v, d => d.value), // 用sum聚合,兼容多数据场景
      d => d.date, // 直接用日期字符串作为分组键
      d => d.name
    )
  )
  .map(([dateStr, data]) => [new Date(dateStr), data]) // 统一转换为Date对象
  .sort(([a], [b]) => d3.ascending(a, b));
}

测试结果

用你的示例数据,修复后会得到符合预期的结果:

[
  [
    Date("2000-01-01T00:00:00.000Z"),
    { "Coca-Cola": 72537, "Microsoft": 70196, "IBM": 53183 }
  ]
]

额外说明

如果你的业务场景中每个(date, name)确实只有一条数据,也可以保留原聚合逻辑,但必须确保分组键正确:

// 仅当每个分组唯一时可用
v => v[0].value

内容的提问来源于stack exchange,提问作者Ifthikar Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:07:36