d3.js filter() 未显示预期结果
d3.js filter() not displaying expected results
过滤器命令没有按预期工作。我将如何重构代码以获得请求的输出?
在 .filter((d,i) => condition)
语法中,d
是具有 x 的对象(date/time string) and y (num cars produced that shift) 该数据点的轴值和 i
是折线图上该数据点的索引。为什么 d.x != testdate#
? 注意:测试日期 1 和 测试日期 2
是与数据点中的两个 date/time 字符串精确匹配的日期时间字符串
在对此进行故障排除时,我还尝试查看 d.x 的 typeof
没有成功。
测试 1 - 注释掉 - 测试 2 和 3 的逆运算,它有效 (表明测试 2 和 3 中的条件不匹配,因为显示点的代码有效)
测试 2 - 未在 04 年 1 月星期一 08:00 数据点看到绿点 class(shorthand 语法)
测试 3 - 未在 2 月 1 日星期六 08:00 数据点(传统语法,diff 数据点)
上看到红点 class
Test4 - 与上面类似,使用 console.log
Test5 - 测试 typeof - console.log 什么都不显示,console.dir 只显示文本词 "object"
Test6 - console.log 显示其中一个数据点与 testdate1
完美匹配
clearconsole();
var chartWidth = 500;
var myCSV = [
{"shift":"1","date":"01/01/2016/08/00/00","car":"178","truck":"125","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00","car":"125","truck":"189","bike":"125","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00","car":"140","truck":"219","bike":"328","moto":"1252"},
{"shift":"4","date":"02/01/2016/17/00/00","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00","car":"230","truck":"170","bike":"390","moto":"400"},
];
var testdate1 = 'Mon Jan 04 2016 08:00:00 GMT-0500 (Eastern Standard Time)';
var testdate2 = 'Sat Jan 02 2016 08:00:00 GMT-0500 (Eastern Standard Time)';
lc1 = dc.lineChart("#line1");
var dateFormat = d3.time.format("%d/%m/%Y/%H/%M/%S");
myCSV.forEach(function (d) {
d.date = dateFormat.parse(d.date);
});
myCSV.forEach(function (d) {
d['car'] = +d['car'];
});
//console.log(myCSV);
var facts = crossfilter(myCSV);
var dateDim = facts.dimension(function (d) {return d.date});
var carDim = facts.dimension(function (d) {return d['car']});
var dgCar = dateDim.group().reduceSum(function (d) {return d['car']});
var minDate = new Date ("2016-01-01T08:00:00.000Z");
var maxDate = new Date ("2016-01-06T17:00:00.000Z");
var maxY = d3.max(myCSV, function(d) {return d['car']});
lc1
.renderArea(false)
.width(chartWidth)
.height(250)
.dimension(dateDim)
.group(dgCar)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Cars')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc1.yAxis().ticks(5);
lc1.xAxis().ticks(3);
lc1.on('renderlet', function(lc1) {
console.log('myCSV.length: '+myCSV.length);
var allDots1 = lc1.selectAll('circle.dot');
//allDots1.filter((d,i) => i != testdate1).classed('pinkdot',true);
allDots1.filter((d,i) => i === testdate1).classed('greendot',true);
allDots1.filter(function(d){ return d.x===testdate2 }).classed('reddot',true);
allDots1.filter(function(d){ if (d.x===testdate2) console.log('Found it') });
allDots1.filter(function(d){ var xyz = d.x; console.dir(typeof xyz) });
allDots1.filter((d, k) => console.log("\r\n["+d.x+"]\r\n["+testdate1+"]") );
});//END lc1.on(renderlet)
dc.renderAll();
dc.redrawAll();
function clearconsole(){
console.API;
if (typeof console._commandLineAPI !== 'undefined') {
console.API = console._commandLineAPI; //chrome
} else if (typeof console._inspectorCommandLineAPI !== 'undefined') {
console.API = console._inspectorCommandLineAPI; //Safari
} else if (typeof console.clear !== 'undefined') {
console.API = console;
}
console.API.clear();
}
svg{height:280px;width:500px;}
.greendot{stroke:green !important; fill:green !important; fill-opacity:1 !important;}
.reddot{stroke:red !important; fill:red !important; fill-opacity:1 !important;}
.pinkdot{stroke:pink; fill:pink; fill-opacity:1 !important;}
<script src="http://cdnjs.cloudflare.com/ajax/libs/d3/3.3.3/d3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.1/crossfilter.min.js"></script>
<script src="http://dc-js.github.io/dc.js/js/dc.js"></script>
<link href="http://dc-js.github.io/dc.js/css/dc.css" rel="stylesheet"/>
<svg id="line1"></svg>
当您进行相等性检查时,testdate
和 testdate2
仍然是字符串。尝试使用 vanilla new Date()
或 d3 的 date/time 函数解析它们:
.filter(function(d){ return d.x >= new Date(testdate2); })
.
仔细检查 JS 日期格式返回的时区 - 如果它们位于不同的时区,即使它们都作为有效的 JS 日期返回,值也可能不相等。
比较日期时,使用getTime()
方法,例如:
allDots1.filter(function(d){
console.log(d.data.value, d.x, +d.x, testdate2, d.x===testdate2, +d.x===testdate2);
return +d.x===testdate2; // + is a shortcut for .getTime()
}).classed('reddot',true);
此外,您应该设置时区的偏移量,
var myCSV = [
{"shift":"1","date":"01/01/2016/08/00/00/+0500","car":"178","truck":"125","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00/+0500","car":"125","truck":"189","bike":"125","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00/-0500","car":"140","truck":"219","bike":"328","moto":"1252"},
//...
];
//...
var dateFormat = d3.time.format("%d/%m/%Y/%H/%M/%S/%Z");
Reference #1: Comparison of dates
过滤器命令没有按预期工作。我将如何重构代码以获得请求的输出?
在 .filter((d,i) => condition)
语法中,d
是具有 x 的对象(date/time string) and y (num cars produced that shift) 该数据点的轴值和 i
是折线图上该数据点的索引。为什么 d.x != testdate#
? 注意:测试日期 1 和 测试日期 2
是与数据点中的两个 date/time 字符串精确匹配的日期时间字符串
在对此进行故障排除时,我还尝试查看 d.x 的 typeof
没有成功。
测试 1 - 注释掉 - 测试 2 和 3 的逆运算,它有效 (表明测试 2 和 3 中的条件不匹配,因为显示点的代码有效)
测试 2 - 未在 04 年 1 月星期一 08:00 数据点看到绿点 class(shorthand 语法)
测试 3 - 未在 2 月 1 日星期六 08:00 数据点(传统语法,diff 数据点)
上看到红点 class
Test4 - 与上面类似,使用 console.log
Test5 - 测试 typeof - console.log 什么都不显示,console.dir 只显示文本词 "object"
Test6 - console.log 显示其中一个数据点与 testdate1
clearconsole();
var chartWidth = 500;
var myCSV = [
{"shift":"1","date":"01/01/2016/08/00/00","car":"178","truck":"125","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00","car":"125","truck":"189","bike":"125","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00","car":"140","truck":"219","bike":"328","moto":"1252"},
{"shift":"4","date":"02/01/2016/17/00/00","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00","car":"230","truck":"170","bike":"390","moto":"400"},
];
var testdate1 = 'Mon Jan 04 2016 08:00:00 GMT-0500 (Eastern Standard Time)';
var testdate2 = 'Sat Jan 02 2016 08:00:00 GMT-0500 (Eastern Standard Time)';
lc1 = dc.lineChart("#line1");
var dateFormat = d3.time.format("%d/%m/%Y/%H/%M/%S");
myCSV.forEach(function (d) {
d.date = dateFormat.parse(d.date);
});
myCSV.forEach(function (d) {
d['car'] = +d['car'];
});
//console.log(myCSV);
var facts = crossfilter(myCSV);
var dateDim = facts.dimension(function (d) {return d.date});
var carDim = facts.dimension(function (d) {return d['car']});
var dgCar = dateDim.group().reduceSum(function (d) {return d['car']});
var minDate = new Date ("2016-01-01T08:00:00.000Z");
var maxDate = new Date ("2016-01-06T17:00:00.000Z");
var maxY = d3.max(myCSV, function(d) {return d['car']});
lc1
.renderArea(false)
.width(chartWidth)
.height(250)
.dimension(dateDim)
.group(dgCar)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Cars')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc1.yAxis().ticks(5);
lc1.xAxis().ticks(3);
lc1.on('renderlet', function(lc1) {
console.log('myCSV.length: '+myCSV.length);
var allDots1 = lc1.selectAll('circle.dot');
//allDots1.filter((d,i) => i != testdate1).classed('pinkdot',true);
allDots1.filter((d,i) => i === testdate1).classed('greendot',true);
allDots1.filter(function(d){ return d.x===testdate2 }).classed('reddot',true);
allDots1.filter(function(d){ if (d.x===testdate2) console.log('Found it') });
allDots1.filter(function(d){ var xyz = d.x; console.dir(typeof xyz) });
allDots1.filter((d, k) => console.log("\r\n["+d.x+"]\r\n["+testdate1+"]") );
});//END lc1.on(renderlet)
dc.renderAll();
dc.redrawAll();
function clearconsole(){
console.API;
if (typeof console._commandLineAPI !== 'undefined') {
console.API = console._commandLineAPI; //chrome
} else if (typeof console._inspectorCommandLineAPI !== 'undefined') {
console.API = console._inspectorCommandLineAPI; //Safari
} else if (typeof console.clear !== 'undefined') {
console.API = console;
}
console.API.clear();
}
svg{height:280px;width:500px;}
.greendot{stroke:green !important; fill:green !important; fill-opacity:1 !important;}
.reddot{stroke:red !important; fill:red !important; fill-opacity:1 !important;}
.pinkdot{stroke:pink; fill:pink; fill-opacity:1 !important;}
<script src="http://cdnjs.cloudflare.com/ajax/libs/d3/3.3.3/d3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.1/crossfilter.min.js"></script>
<script src="http://dc-js.github.io/dc.js/js/dc.js"></script>
<link href="http://dc-js.github.io/dc.js/css/dc.css" rel="stylesheet"/>
<svg id="line1"></svg>
testdate
和 testdate2
仍然是字符串。尝试使用 vanilla new Date()
或 d3 的 date/time 函数解析它们:
.filter(function(d){ return d.x >= new Date(testdate2); })
.
仔细检查 JS 日期格式返回的时区 - 如果它们位于不同的时区,即使它们都作为有效的 JS 日期返回,值也可能不相等。
比较日期时,使用getTime()
方法,例如:
allDots1.filter(function(d){
console.log(d.data.value, d.x, +d.x, testdate2, d.x===testdate2, +d.x===testdate2);
return +d.x===testdate2; // + is a shortcut for .getTime()
}).classed('reddot',true);
此外,您应该设置时区的偏移量,
var myCSV = [
{"shift":"1","date":"01/01/2016/08/00/00/+0500","car":"178","truck":"125","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00/+0500","car":"125","truck":"189","bike":"125","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00/-0500","car":"140","truck":"219","bike":"328","moto":"1252"},
//...
];
//...
var dateFormat = d3.time.format("%d/%m/%Y/%H/%M/%S/%Z");
Reference #1: Comparison of dates