在D3.js中,我目前正在尝试根据数据数组是否包含时间来填充一个空数组(数组只包含每5分钟后的时间戳)。如果数据数组包含时间,它应该复制值,否则为null。但是当我尝试比较两个时间对象时,它无法正常工作。
以下是代码(当前代码不是复制值,而是打印以使调试更容易):
var data = [{"mytime": "2015-12-01T23:10:00.000Z", "value": 64},
{"mytime": "2015-12-01T23:15:00.000Z", "value": 67},
{"mytime": "2015-12-01T23:20:00.000Z", "value": 70},
{"mytime": "2015-12-01T23:25:00.000Z", "value": 64},
{"mytime": "2015-12-01T23:30:00.000Z", "value": 72},
{"mytime": "2015-12-01T23:35:00.000Z", "value": 75},
{"mytime": "2015-12-01T23:40:00.000Z", "value": 71},
{"mytime": "2015-12-01T23:45:00.000Z", "value": 80},
{"mytime": "2015-12-02T00:00:00.000Z", "value": 80},
{"mytime": "2015-12-02T00:05:00.000Z", "value": 85}
];
var parseDate = d3.time.format("%Y-%m-%dT%H:%M:%S.%LZ").parse;
data.forEach(function(d) {
d.mytime = parseDate(d.mytime);
});
var act_data = [];
var x_extent = d3.extent(data, function(d){
return d['mytime']});
time_arr = d3.time.minute.range(x_extent[0],x_extent[1],5);
for(var key in time_arr){
var temp;
temp = contains(data,time_arr[key],'mytime');
}
function contains(data,value,variable)
{
var i =data.length;
while(i--){
if (data[i][variable] === value)
{
console.log('found');
return i;
}
}
return false;
}
字符串
输出应为:
data = [{"mytime": "2015-12-01T23:10:00.000Z", "value": 64},
{"mytime": "2015-12-01T23:15:00.000Z", "value": 67},
{"mytime": "2015-12-01T23:20:00.000Z", "value": 70},
{"mytime": "2015-12-01T23:25:00.000Z", "value": 64},
{"mytime": "2015-12-01T23:30:00.000Z", "value": 72},
{"mytime": "2015-12-01T23:35:00.000Z", "value": 75},
{"mytime": "2015-12-01T23:40:00.000Z", "value": 71},
{"mytime": "2015-12-01T23:45:00.000Z", "value": 80},
{"mytime": "2015-12-01T23:50:00.000Z", "value": null},
{"mytime": "2015-12-01T23:55:00.000Z", "value": null},
{"mytime": "2015-12-02T00:00:00.000Z", "value": 80},
{"mytime": "2015-12-02T00:05:00.000Z", "value": 85}
];
型
3条答案
按热度按时间qeeaahzv1#
你可以这样做:
字符串
工作代码here
kninwzqo2#
随着ES6的出现,有更多的选项可以解决这个问题。根据需要支持的浏览器版本,下面的代码可能是一个可行的方法。我已经在Chrome 49和FF 45上成功测试了这个方法。
该解决方案将自定义generator function添加到
data
数组中,该数组将返回符合新iteration protocols的Generator
对象。这将覆盖data
数组并填充它检测到的任何间隙,沿着将value
属性设置为null
的对象。代码片段进一步使用spread operator创建一个新数组,并通过隐式调用迭代器填充它。
字符串
看看下面的代码片段,看看在Chrome 49和FF 45中运行的演示:
的数据
或者,你可以提供一个迭代器协议的显式实现。这写起来有点冗长,但不会改变整体概念:
型
下面的代码片段演示了这一点:
gopyfrb33#
您可以使用(D3 3.x API)
d3.time.format
解析和格式化日期d3.extent
来确定时间戳的边界d3.time.scale
以生成要输出的分笔成交点d3.map
对输入进行散列并确定值是否存在这给了我们
字符串
以及一个http://jsfiddle.net/nikoshr/qxcLry8z/演示
的数据