Javascript 比较D3.js中的两个时间对象

Javascript 比较D3.js中的两个时间对象,javascript,arrays,d3.js,Javascript,Arrays,D3.js,在D3.js中,我目前正试图根据数组是否包含该时间的数据填充一个空数组(数组每5分钟只包含一个时间戳)。如果数据数组包含时间,则应复制该值,否则为null。但是,当我试图比较这两个时间对象时,它不能正常工作 以下是代码(当前代码不是复制值,而是打印以简化调试): 输出应如下所示: data = [{"mytime": "2015-12-01T23:10:00.000Z", "value": 64}, {"mytime": "2015-12-01T23:15:00.000Z", "value":

在D3.js中,我目前正试图根据数组是否包含该时间的数据填充一个空数组(数组每5分钟只包含一个时间戳)。如果数据数组包含时间,则应复制该值,否则为null。但是,当我试图比较这两个时间对象时,它不能正常工作

以下是代码(当前代码不是复制值,而是打印以简化调试):

输出应如下所示:

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

您可以这样做:

var extent = d3.extent(data, function(d){ return d.mydate});//get the max min limit
var data1 = []; make an empty array
for (var i =0; i < data.length -1; i++){
    var diff = data[i + 1].mytime.getTime() - data[i].mytime.getTime();
    if (diff <= 300000){ //less than equal to 5 minutes
        data1.push(data[i])
    } else { //greater than 5 minutes
      var t1 = new Date(data[i].mytime.getTime() + 300000)
        var t2 = new Date(data[i +1].mytime.getTime() - 300000)
        data1.push({"mytime": t1, "value": null})
        data1.push({"mytime": t2, "value": null})
    }
}
data1.push(data[data.length -1]); //take the last value as it was not processed
data = data1
var-extent=d3.extent(数据,函数(d){return d.mydate})//获取最大最小限制
VarData1=[];空数组
对于(var i=0;i如果(diff您可以这样做:

var extent = d3.extent(data, function(d){ return d.mydate});//get the max min limit
var data1 = []; make an empty array
for (var i =0; i < data.length -1; i++){
    var diff = data[i + 1].mytime.getTime() - data[i].mytime.getTime();
    if (diff <= 300000){ //less than equal to 5 minutes
        data1.push(data[i])
    } else { //greater than 5 minutes
      var t1 = new Date(data[i].mytime.getTime() + 300000)
        var t2 = new Date(data[i +1].mytime.getTime() - 300000)
        data1.push({"mytime": t1, "value": null})
        data1.push({"mytime": t2, "value": null})
    }
}
data1.push(data[data.length -1]); //take the last value as it was not processed
data = data1
var extent=d3.extent(数据,函数(d){return d.mydate});//获取最大最小限制
var data1=[];创建一个空数组
对于(var i=0;i
  • 解析和格式化日期
  • 确定时间戳的边界
  • 生成要输出的刻度
  • 以及散列您的输入并确定是否存在值
这给了我们

var data = [...];

// for parsing and formatting
var timeformat = d3.time.format("%Y-%m-%dT%H:%M:%S.%LZ");

// range to operate on
var extent = d3.extent(data, function(d){ 
    return timeformat.parse(d.mytime); 
});

// scale representing the time stamps
var scale = d3.time.scale()
    .domain(extent) // the boundaries
    .ticks(d3.time.minute, 5); // 5 minutes intervals

// easier to determine if a value exists
var hashed = d3.map(data, function(d) { return d.mytime; });

// or if your version < 3.5
/*
var hashed = d3.map();
data.forEach(function(d) { 
    hashed.set(d.mytime, d);
});
*/


// transforms the scale into the desired output
var res = scale.map(function(t) {
    var ft = timeformat(t);
    return {
        mytime: ft,
        value: (hashed.has(ft)) ? hashed.get(ft).value : null
    };
});
var数据=[…];
//用于解析和格式化
var timeformat=d3.time.format(“%Y-%m-%dT%H:%m:%S.%LZ”);
//手术范围
变量范围=d3.extent(数据,函数(d){
返回timeformat.parse(d.mytime);
});
//表示时间戳的比例
var scale=d3.time.scale()
.domain(extent)//边界
.ticks(d3.time.minute,5);//间隔5分钟
//更容易确定值是否存在
var hashed=d3.map(数据,函数(d){return d.mytime;});
//或者如果您的版本<3.5
/*
var hashed=d3.map();
data.forEach(函数(d){
hashed.set(d.mytime,d);
});
*/
//将比例转换为所需的输出
var res=比例映射(函数(t){
var ft=时间格式(t);
返回{
mytime:ft,
value:(hashed.has(ft))?hashed.get(ft).value:null
};
});
还有一个演示

var数据=[
{“mytime”:“2015-12-01T23:10:00.000Z”,“值”:64},
{“mytime”:“2015-12-01T23:15:00.000Z”,“值”:67},
{“mytime”:“2015-12-01T23:20:00.000Z”,“值”:70},
{“mytime”:“2015-12-01T23:25:00.000Z”,“值”:64},
{“mytime”:“2015-12-01T23:30:00.000Z”,“值”:72},
{“mytime”:“2015-12-01T23:35:00.000Z”,“值”:75},
{“mytime”:“2015-12-01T23:40:00.000Z”,“值”:71},
{“mytime”:“2015-12-01T23:45:00.000Z”,“值”:80},
{“mytime”:“2015-12-02T00:00:00.000Z”,“值”:80},
{“mytime”:“2015-12-02T00:05:00.000Z”,“值”:85}
];
var timeformat=d3.time.format(“%Y-%m-%dT%H:%m:%S.%LZ”);
变量范围=d3.extent(数据,函数(d){
返回timeformat.parse(d.mytime);
});
var scale=d3.time.scale()
.域(范围)
.滴答声(d3.time.minute,5);
var hashed=d3.map();
data.forEach(函数(d){
hashed.set(d.mytime,d);
});
var res=比例映射(函数(t){
var ft=时间格式(t);
返回{
mytime:ft,
value:(hashed.has(ft))?hashed.get(ft).value:null
};
});
变量$table=$('');
res.forEach(功能(d){
$table.append(“”+d.mytime+“”+d.value+“”)
});
$('body')。追加($table);

您可以使用

  • 解析和格式化日期
  • 确定时间戳的边界
  • 生成要输出的刻度
  • 以及散列您的输入并确定是否存在值
这给了我们

var data = [...];

// for parsing and formatting
var timeformat = d3.time.format("%Y-%m-%dT%H:%M:%S.%LZ");

// range to operate on
var extent = d3.extent(data, function(d){ 
    return timeformat.parse(d.mytime); 
});

// scale representing the time stamps
var scale = d3.time.scale()
    .domain(extent) // the boundaries
    .ticks(d3.time.minute, 5); // 5 minutes intervals

// easier to determine if a value exists
var hashed = d3.map(data, function(d) { return d.mytime; });

// or if your version < 3.5
/*
var hashed = d3.map();
data.forEach(function(d) { 
    hashed.set(d.mytime, d);
});
*/


// transforms the scale into the desired output
var res = scale.map(function(t) {
    var ft = timeformat(t);
    return {
        mytime: ft,
        value: (hashed.has(ft)) ? hashed.get(ft).value : null
    };
});
var数据=[…];
//用于解析和格式化
var timeformat=d3.time.format(“%Y-%m-%dT%H:%m:%S.%LZ”);
//手术范围
变量范围=d3.extent(数据,函数(d){
返回timeformat.parse(d.mytime);
});
//表示时间戳的比例
var scale=d3.time.scale()
.domain(extent)//边界
.ticks(d3.time.minute,5);//间隔5分钟
//更容易确定值是否存在
var hashed=d3.map(数据,函数(d){return d.mytime;});
//或者如果您的版本<3.5
/*
var hashed=d3.map();
data.forEach(函数(d){
hashed.set(d.mytime,d);
});
*/
//将比例转换为所需的输出
var res=比例映射(函数(t){
var ft=时间格式(t);
返回{
mytime:ft,
value:(hashed.has(ft))?hashed.get(ft).value:null
};
});
还有一个演示

var数据=[
{“mytime”:“2015-12-01T23:10:00.000Z”,“值”:64},
{“mytime”:“2015-12-01T23:15:00.000Z”,“值”:67},
{“mytime”:“2015-12-01T23:20:00.000Z”,“值”:70},
{“mytime”:“2015-12-01T23:25:00.000Z”,“值”:64},
{“mytime”:“2015-12-01T23:30:00.000Z”,“值”:72},
{“mytime”:“2015-12-01T23:35:00.000Z”,“值”:75},
{“mytime”:“2015-12-01T23:40:00.000Z”,“值”:71},
{“mytime”:“2015-12-01T23:45:00.000Z”,“值”:80},
{“mytime”:“2015-12-02T00:00:00.000Z”,“值”:80},
{“mytime”:“2015-12-02T00:05:00.000Z”,“值”:85}
];
var timeformat=d3.time.format(“%Y-%m-%dT%H:%m:%S.%LZ”);
变量范围=d3.extent(数据,函数(d){
返回timeformat.parse(d.mytime);
});
var scale=d3.time.scale()
.域(范围)
.滴答声(d3.time.minute,5);
var hashed=d3.map();
data.forEach(函数(d){
hashed.set(d.mytime,d);
});
var res=比例映射(函数(t){
var ft=时间格式(t);
返回{
mytime:ft,
value:(hashed.has(ft))?hashed.get(ft).value:null
};
});
变量$table=$('');
res.forEach(功能(d){
$table.append(“”+d.mytime+“”+d.value+“”)
});
$('body')。追加($table);

随着ES6的出现,有更多的选项可用于处理此任务。根据需要支持的浏览器版本,以下代码可能是一种可行的方法。我已在Chrome 49和FF 45上成功测试了这一点

该解决方案向
数据
数组添加一个自定义项,该自定义项将返回符合