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

mot*_*dev 1 d3.js

我在d3中有以下代码

const weeksOfYear = d3.nest()
 .key(d => d.dateObj.week())
 .sortKeys(d3.ascending)
 .entries(pics);
Run Code Online (Sandbox Code Playgroud)

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

有些人d3.nest()把它变成了一个字符串值,因此我按字母顺序排序应该是一个数字顺序.即,我的输出是:

1
10
11
12
13
2
20
21
22
23
...
Run Code Online (Sandbox Code Playgroud)

虽然我想要它订购 1,2,3,4...

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

alt*_*lus 5

分析

d3.nest()没有内部使用d3.map()建筑嵌套结构时.并且,正如文档所述d3.map():

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

通过强制keyValue转换为字符串来构建嵌套结构时,会明确地处理这个问题:

if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
Run Code Online (Sandbox Code Playgroud)

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

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