Javascript dc.js图表组在单击父图表后未使用正确的图表值进行更新
我这里的问题是,我有一个用于计算节省的crossfilter group reduce函数,但是当在图表上应用过滤器时,它似乎没有通过正确的过滤器。我还有一个类似的案例工作示例 我创建了两个jsbin,其中一个具有正确的行为 我有2010年和2014年两年的数据。但在储蓄(不起作用)图表中,承运人饼图不按年份过滤,而在DIFOT(起作用)图表中过滤 链接如下: DIFOT(工作): 节省(未按预期工作): 非常感谢你的时间和努力 问候,,Javascript dc.js图表组在单击父图表后未使用正确的图表值进行更新,javascript,dc.js,crossfilter,Javascript,Dc.js,Crossfilter,我这里的问题是,我有一个用于计算节省的crossfilter group reduce函数,但是当在图表上应用过滤器时,它似乎没有通过正确的过滤器。我还有一个类似的案例工作示例 我创建了两个jsbin,其中一个具有正确的行为 我有2010年和2014年两年的数据。但在储蓄(不起作用)图表中,承运人饼图不按年份过滤,而在DIFOT(起作用)图表中过滤 链接如下: DIFOT(工作): 节省(未按预期工作): 非常感谢你的时间和努力 问候,, Animesh要跟踪这些计算问题,您确实需要使用调试器并
Animesh要跟踪这些计算问题,您确实需要使用调试器并在缩减函数或绘图函数中放置断点,以查看最终得到的缩减值 我发现在jsbin中使用浏览器的调试器非常困难(不可能?),因此我再次将您的代码粘贴到两个JSFIDLE中: parseFloat版本: parseInt版本: 现在,我们在chart.redraw(dc.js:1139)中设置一个断点,以查看它在单击切片时试图绘制的值 第一次点击断点并不有趣,因为它只是我们点击的年度图表,但第二次点击的是航母图表,它揭示了很多。正在为parseInt版本打印
\u chart.group().all()
:
现在,对于parseFloat版本:
由于int版本的计算结果是精确的,因此最终的结果是1-0/0===NaN
,而dc.js或d3.js会默默地将NaN
强制为零
但由于浮点计算从来都不是精确的,因此最终得到的结果是1-0/-3e-15===1
您希望避免除以零或任何接近零的值,因此在缩减函数中添加一个检查将产生(我认为)所需的结果:
var group = Dim.group().reduce(
function(p,v){
p.current += parseFloat(v.currentPrice);
p.compare += parseFloat(v.comparePrice);
if(Math.abs(p.compare) > 0.01) {
p.savings = p.current/p.compare;
p.result = 1-p.savings;
}
else p.result = 0;
return p;
},
function(p,v){
p.current -= parseFloat(v.currentPrice);
p.compare -= parseFloat(v.comparePrice);
if(Math.abs(p.compare) > 0.01) {
p.savings = p.current/p.compare;
p.result = 1-p.savings;
}
else p.result = 0;
return p;
},
function(){return { current: 0, compare: 0,savings:0, result:0};}
);
工作版本(我想):我不明白。他们似乎都为我过滤。JS Bin对一些分号吹毛求疵,这里是DIFOT和Savings Hello Gordon感谢您的快速回复,我特别面临的问题是筛选正确的值。对于这两组图表,我使用的数据相同,因此我只有一个2010年和1117年的记录。但在节省费用的情况下,当在年度饼图中选择2010年时,所有承运人的费用都会显示出来。而DIFOT carrier chart获得了正确的年份过滤器,因此显示了特定年份的数据。谢谢。在进一步的调查中,我发现如果我将当前和比较价格解析为int而不是float(我现在正在做),那么按年份筛选的储蓄图表会有预期的行为。希望这有帮助。谢谢我不确定你在计算什么,但是因为你的reduce函数没有考虑
计数
,所以它会忽略它们是否被过滤。作为一个例子,这里是一个例子的分支(作为一个JSFIDLE:更容易调试),其计数乘以结果-不确定这对您的计算是否有意义,但它更好地反映了过滤器:非常感谢Gordon。我使用count只是为了调试,我将在reduce函数中发布一个没有count的bin。垃圾箱的链接是。如果在reduce函数中将parseFloat更改为parseInt,则过滤将正常工作。希望这些信息有意义。谢谢,非常感谢戈登的解释。如果要修复我的问题,我必须测试整个应用程序以检查修复情况,因为我一直在使用dc开发仪表板。如果我有更多问题,将再次发布。再次非常感谢。干杯:)