d3.min.js给出Uncaught TypeError:n.apply不是函数

时间:2016-08-22 19:49:08

标签: date d3.js formatting

我正在尝试根据以下两个变量cx(应该是一年中的那一天)和cy(应该是小时+分钟/ 60)分割日期时间:

<!-- date format of d.date: 24-8-2016 9:47:38-->
            var parseDayinYearFormat = d3.time.format('%j').parse;
            var parseHourFormat = d3.time.format('%H').parse;
            var parseMinuteFormat = d3.time.format('%M').parse;

            <!-- add the objects-->
            var circles = svg.selectAll("circle")
                .data(data)
                .enter()
                .append("circle");
            var circleAttributes = circles
                .attr("cx", function (d) { return +parseDayinYearFormat(d.date);  })
                .attr("cy", function (d) { return +parseHourFormat(d.date)+(parseMinuteFormat(d.date)/60);  })
                .attr("r", function (d)  { return 20.0/(9-d.total); })
                .attr("class", function (d) {if (d.w>d.total-d.w) {return "cr"} else { return "cb" }});

但是d3不是很好玩:cx和cy成为NaN而d3给出错误Uncaught TypeError:n.apply不是函数

请帮忙。

1 个答案:

答案 0 :(得分:2)

您需要使用单个格式对象解析整个字符串。您无法使用一系列解析来解析字符串。

使用d3 version 3.x documentation我提出了以下内容,这适用于您的示例。

var datestring = '24-8-2016 9:47:38';
var format = d3.time.format('%-d-%-m-%Y %-H:%-M:%-S');

console.log(format.parse(datestring))
// "2016-08-24T13:47:38.000Z" // (my time zone is UTC-4)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

请注意,因为您的示例24-8-2016 9:47:38有许多字段没有显示零填充,所以我在%和说明符之间使用短划线,即%-d,告诉d3一开始可能没有零。

另请注意,在您的示例中,无法 24是一年中的一天,介于1到366之间:24显然只是<强>月,对吧?

但是,从您的代码段中可以看出,您只想从字符串中提取日期,小时和分钟。出于这个简单的目的,d3.time.format可能有点矫枉过正,因为它会为您提供一个Date对象,然后您必须解析它以提取日/小时/分钟。考虑使用正则表达式执行此任务。