首页 > 解决方案 > JavaScript/D3 getFullYear() 不是函数

问题描述

我在 JSON 对象中将日期格式化为“2020-04-01”。我将它们转换为日期如下:

for(var j = 0; j < json_data.length; j++) {
       var timeParse = d3.timeParse("%Y-%m-%d");
       json_data[j]["date"] = timeParse(json_data[j]["date"])
   }

我可以 console.log 这些,它们是对象: 在此处输入图像描述

然后,我将 d3.nest 与汇总一起使用,按日期聚合我的数据:

   const days =
   d3.nest()
   .key(function(d) { return d.date; })
   .rollup(function(d) { return d3.sum(d, function(d) { return d.cases; }); })
   .entries(json_data)

然后我尝试按年再次筑巢:

   const years =
   d3.nest()
  .key(d => d.key.getFullYear())
  .entries(days)
  .reverse()

我得到 getFullYear() 不是函数的错误。我猜这是因为在某些时候我的数据值被转换为字符串而不是对象。

标签: javascriptd3.js

解决方案


这是预期的行为。如果您查看API,您会看到key()

注册一个新的键功能。将为输入数组中的每个元素调用 key 函数,并且必须返回一个字符串标识符以将元素分配给其组。(强调我的)

显而易见的解决方案是在循环中删除时间解析for,并使用嵌套中的日期字符串。请注意,这可能会破坏您代码中的其他内容,但我们不能仅通过您发布的内容来判断它。

然后,在第二个嵌套中,您可以使用正则表达式或解析日期:

.key(d => timeParse(d.key).getFullYear())

最后,请记住(基于上面的引用),尽管getFullYear()返回了一个数字,但该数字将被转换为一个字符串。


推荐阅读