Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript dc.js图表组在单击父图表后未使用正确的图表值进行更新_Javascript_Dc.js_Crossfilter - Fatal编程技术网

Javascript dc.js图表组在单击父图表后未使用正确的图表值进行更新

Javascript dc.js图表组在单击父图表后未使用正确的图表值进行更新,javascript,dc.js,crossfilter,Javascript,Dc.js,Crossfilter,我这里的问题是,我有一个用于计算节省的crossfilter group reduce函数,但是当在图表上应用过滤器时,它似乎没有通过正确的过滤器。我还有一个类似的案例工作示例 我创建了两个jsbin,其中一个具有正确的行为 我有2010年和2014年两年的数据。但在储蓄(不起作用)图表中,承运人饼图不按年份过滤,而在DIFOT(起作用)图表中过滤 链接如下: DIFOT(工作): 节省(未按预期工作): 非常感谢你的时间和努力 问候,, Animesh要跟踪这些计算问题,您确实需要使用调试器并

我这里的问题是,我有一个用于计算节省的crossfilter group reduce函数,但是当在图表上应用过滤器时,它似乎没有通过正确的过滤器。我还有一个类似的案例工作示例

我创建了两个jsbin,其中一个具有正确的行为

我有2010年和2014年两年的数据。但在储蓄(不起作用)图表中,承运人饼图不按年份过滤,而在DIFOT(起作用)图表中过滤

链接如下: DIFOT(工作): 节省(未按预期工作):

非常感谢你的时间和努力

问候,,
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开发仪表板。如果我有更多问题,将再次发布。再次非常感谢。干杯:)