我从D3.js嵌套功能中得到一些奇怪的行为,好像密钥和汇总正在将test_date从Date对象转换为字符串。
这是我的代码:
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
}]
}]
我需要嵌套键值为日期对象而不是字符串。有没有人知道会导致这种情况的原因是什么?
的问题解答答案 0 :(得分:3)
函数(和对象)d3.time.format
以两种方式工作:
d3.time.format('%Y-%m-%d').parse('2014-08-29')
将返回Date
个对象。它使用该格式来了解如何解释作为参数给出的字符串。d3.time.format('%Y-%m-%d')(new Date(2014, 7, 29))
将返回格式为2014-08-29'
的字符串。此外,d3.nest
中的键将始终强制为字符串。您需要组合两种形式才能获得所需的行为。问候。
答案 1 :(得分:0)
我找到了一个对我有用的解决方案。我遇到了类似的问题。 我想用时间戳作为键来嵌套数据。 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;
我使用另一个字段仅将日期用于嵌套数据的键,而不将数据解析为日期/时间。
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_date
作为对象,因为key_date
是一个字符串。
result.forEach(function(d) {
d.test_date = parseDate(d.key);
});
我不知道这是否是一个很好的方法。 如果没有,请咨询。 感谢...