d3.nest将键转换为字符串值

时间:2017-01-10 22:20:43

标签: d3.js

我在d3中有以下代码

const weeksOfYear = d3.nest()
 .key(d => d.dateObj.week())
 .sortKeys(d3.ascending)
 .entries(pics);

d.dateObj属性是Moment.js对象。 .week()方法返回一个数字。

d3.nest()中,它将密钥转换为字符串值,因此我按字母顺序排序应该是一个数字顺序。 即,我的输出是:

1
10
11
12
13
2
20
21
22
23
...

我希望它订购1,2,3,4...

我还没有在文档中找到这个技巧。

1 个答案:

答案 0 :(得分:5)

分析

构建嵌套结构时,d3.nest()make use内部执行d3.map()。而且,正如d3.map()上的文档所示:

  
      
  • 密钥被强制转换为字符串。
  •   

通过将keyValue强制转换为字符串来构建嵌套结构时,会明确注意这一点:

if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {

解决方案

D3的比较器d3.ascending在比较之前不会将字符串转换为数字。要对键进行数字比较,需要包装此比较器并事先进行转换:

const weeksOfYear = d3.nest()
 .key(d => d.dateObj.week())
 .sortKeys((a, b) => d3.ascending(+a, +b))
 .entries(pics);