Javascript D3嵌套格式日期不正确

Javascript D3嵌套格式日期不正确,javascript,d3.js,Javascript,D3.js,我从D3.js nest功能中得到了一些奇怪的行为,似乎key和rollup正在将test_日期从日期对象转换为字符串 这是我的密码: var data = [{ "test_type": "x1", "test_date": "2014-07-15" }, { "test_type": "x3", "test_date": "2014-07-16" }, { "test_type": "x2", "test_date": "2014-07-27"

我从D3.js nest功能中得到了一些奇怪的行为,似乎key和rollup正在将test_日期从日期对象转换为字符串

这是我的密码:

var data = [{
    "test_type": "x1",
    "test_date": "2014-07-15"
}, {
    "test_type": "x3",
    "test_date": "2014-07-16"
}, {
    "test_type": "x2",
    "test_date": "2014-07-27"
}, {
    "test_type": "x1",
    "test_date": "2014-07-28"
}];

var parseDate = d3.time.format("%Y-%m-%d").parse;


data.forEach(function(d) {
    d.test_date = parseDate(d.test_date);
});

var result = d3.nest()
    .key(function(d) {
        return d.test_type;
    })
    .key(function(d) {
        return d.test_date;
    })
    .rollup(function(leaves) {
        return leaves.length;
    })
    .entries(data);
结果是:

[{
    "key": "x1",
    "values": [{
        "key": "Tue Jul 15 2014 00:00:00 GMT-0600 (Mountain Daylight Time)",
        "values": 1
    }, {
        "key": "Mon Jul 28 2014 00:00:00 GMT-0600 (Mountain Daylight Time)",
        "values": 1
    }]
}, {
    "key": "x3",
    "values": [{
        "key": "Wed Jul 16 2014 00:00:00 GMT-0600 (Mountain Daylight Time)",
        "values": 1
    }]
}, {
    "key": "x2",
    "values": [{
        "key": "Sun Jul 27 2014 00:00:00 GMT-0600 (Mountain Daylight Time)",
        "values": 1
    }]
}]
我需要嵌套的键值是日期对象而不是字符串。有人知道这是什么原因吗

下面是一个JSFIDLE,它的功能(和对象)以两种方式工作:

  • d3.time.format(“%Y-%m-%d”).parse('2014-08-29')
    将返回一个
    Date
    对象。它使用该格式了解如何解释作为参数给出的字符串
  • d3.time.format(“%Y-%m-%d”)(新日期(2014,7,29))
    将返回字符串,格式为
    2014-08-29'

此外,
d3.nest
中的键将始终强制为字符串。您将需要结合这两种形式来获得所需的行为。问候。

我找到了一个适合我的解决方案。我也有类似的问题。 我想用时间戳作为键嵌套数据。AmeliaBR写道,键是字符串。但是,我想使用关键点作为对象,因为它应该是图表的x轴

var data = [{
    "test_type": "x1",
    "test_date": "2014-07-15"
}, {
    "test_type": "x3",
    "test_date": "2014-07-16"
}, {
    "test_type": "x2",
    "test_date": "2014-07-27"
}, {
    "test_type": "x1",
    "test_date": "2014-07-15"
}];

var parseDate = d3.time.format("%Y-%m-%d").parse;
我正在为嵌套数据的键使用另一个字段date,而没有将数据解析为date/time

data.forEach(function(d) {
    d.key_date = d.test_date;
    d.test_date = parseDate(d.test_date);
});

var result = d3.nest()
    .key(function(d) {
        return d.key_date;
    })
    .rollup(function(leaves) {
        return leaves.length;
    })
    .entries(data);
对于
result
我再次添加
test\u date
作为一个对象,因为
key\u date
是一个字符串

result.forEach(function(d) {
    d.test_date = parseDate(d.key);
});
我不知道这是不是一个好办法。 如果没有,请提供建议。
谢谢…

恐怕这不是“不正确”的行为——这是方法的定义方式(与Javascript对象或d3.map hashmap相同,后者在内部用于创建嵌套)。通常,我建议只从值数组中的第一个条目访问原始数据值,但rollup函数会删除该选项。这并不理想,但您应该能够强制字符串返回到一个日期,而不会丢失数据。感谢您的回复。这就是我最后做的。这不是一个好主意。它只是回避了这个问题,因为您的键也是字符串。更糟糕的是,您需要两次迭代
result
来解析日期。我建议您转储第一个
。forEach
一起使用
test\u date
字符串作为嵌套,然后进行解析。我知道在
result
上迭代两次不是一个好主意。但我需要
数据
,因为这是为了进一步处理。我会采纳你的建议,考虑一个更好的解决办法。谢谢。我找到了更好的解决办法。我在sql语句中进行汇总。不管怎样,速度似乎更快。