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
相关产品推荐
相关产品推荐

