2014-08-29 89 views
3

我从D3.js嵌套功能中得到一些奇怪的行为,好像密钥和汇总将test_date从Date对象转换为字符串。D3嵌套格式错误的日期

这里是我的代码:

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 
    }] 
}] 

我需要的嵌套的键值是日期的对象不是字符串。有没有人知道这会导致什么?

这里是问题http://jsfiddle.net/2ryahc9L/1/

+0

恐怕这不是“不正确”的行为 - 它是如何定义的方法,[键总是被视为字符串](https://github.com/mbostock/d3/ wiki/Arrays#nest_key)(与JavaScript对象或d3.map hashmap相同,它们在内部用于创建嵌套)。通常,我会建议从values数组中的第一个条目访问原始数据值,但汇总功能会删除该选项。这并不理想,但您应该能够将字符串强制退回到一个日期而不会丢失数据。 – AmeliaBR 2014-08-29 22:13:04

+0

谢谢你的回应。这就是我最终做的。 – 2014-08-29 22:13:39

回答

3

的函数(对象)两种方式d3.time.format工作的jsfiddle:

  • 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中的密钥总是被强制为字符串。你将需要结合两种形式来获得所需的行为。问候。

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); 
}); 

我不知道,如果这是一个好办法做到这一点。 如果没有,请咨询。 谢谢...

+0

这不是一个好主意。它只是提出了问题,因为你的钥匙也是字符串。更糟的是,因为你迭代了'result'来解析日期。我建议你把第一个'.forEach'完全转储出来,像你的嵌套一样使用'test_date'字符串,然后进行解析。 – altocumulus 2017-02-16 12:05:29

+0

我知道在'result'上迭代两次并不是一个好主意。但我需要'数据'作为进一步处理。我会听取您的建议并考虑更好的解决方案。谢谢。 – 2017-02-16 12:15:53

+0

我找到了更好的解决方案。我在我的sql语句中进行汇总。无论如何,似乎更快。 – 2017-02-19 11:24:24