2017-07-11 15 views
0

空のビンを削除しようとしています。また、dc.js dataTableに0の値を持つ行を表示しますか?dc.js dataTableから空のビンを削除できません

にある&スニペットをdc.jsのよくある質問に記載しましたが、まだ希望の結果が得られていません。

私は偽のグループを使用してデータをグループ化し、次に合計金額の降順でテーブルをソートしようとしています。私は、デバッガで確認するが、それでも何とか0の値がフィルタリングされていないとき

var data = [{salesman: "AB",name: "John",total: 190.1,type: "Tab"}, 
      {salesman: "CD",name: "David",total: 190,type: "Tab"}, 
      {salesman: "EF",name: "Elton",total: 300.5,type: "Visa"}, 
      {salesman: "AB",name: "John",total: 90.0,type: "Tab"}, 
      {salesman: "EF",name: "Elton",total: 90,type: "Tab"}, 
      {salesman: "CD",name: "David",total: 90,type: "Tab"}]; 

var ndx = crossfilter(data); 
var salesManDim = ndx.dimension(function(d) { 
    return d.salesman; 
}); 
var salesmanSumGroup = salesManDim.group().reduceSum(function(d) { 
    return (Math.round((d.total) * 100)/100); 
}); 
var salesmanChart = dc.pieChart("#chart"); 
salesmanChart 
    .width(200) 
    .height(150) 
    .slicesCap(10) 
    .innerRadius(30) 
    .dimension(salesManDim) 
    .group(salesmanSumGroup); 

var salesMan_TypeDim = ndx.dimension(function(d) { 
    return d.salesman + "/" + d.type; 
}); 
var groupedDimension = salesMan_TypeDim.group().reduce(
    function(p, v) { 
    p.TOTAL += +(Math.round((v.total) * 100)/100); 
    p.SALESMAN = v.salesman + " - " + v.name; 
    p.TYPE = v.type; 
    return p; 
    }, 
    function(p, v) { 
    p.TOTAL -= +(Math.round((v.total) * 100)/100); 
    p.SALESMAN = v.salesman + " - " + v.name;; 
    p.TYPE = v.type; 
    return p; 
    }, 
    function() {return { TOTAL: 0, SALESMAN: "",TYPE: ""};}); 

var rank = function(p) { 
    return p.key.substr(p.key.lastIndexOf("/") + 1); 
}; 

function remove_empty_bins(source_group) { 
    function non_zero_pred(d) { 
    return d.value.TOTAL !== 0; 
    } 
    return { 
    top: function(n) { 
     return source_group.top(Infinity).filter(non_zero_pred).slice(0, n); 
    } 
    }; 
} 
dc.dataTable(".dc-data-table") 
    .dimension(remove_empty_bins(groupedDimension)) 
    .group(rank) 
    .size(Infinity) 
    .columns([ 
    function(d) { 
     return d.value.SALESMAN; 
    }, 
    function(d) { 
     return (Math.round((d.value.TOTAL) * 100)/100); 
    } 
    ]) 
    .sortBy(function(d) { 
    return d.value.TOTAL; 
    }) 
    .order(d3.descending); 
dc.renderAll(); 
dc.redrawAll(); 

削除空ビン機能が正常に動作します。私の鍵が定義されている方法のためですか? To best explain my scenario here is a jsFiddle for the above example

答えて

1

このような簡単な例では驚くべきことですが、浮動小数点の加算と減算は、期待したときにゼロでない値につながることがあります。

これは特に10進数で発生します。 0.1 is unrepresentable in binary floating point numbers, and they are not necessarily associative or distributive.

我々は問題を診断するために以下の行を追加することができます。

.on('preRedraw', function(chart) { 
     console.log(chart.dimension().top(Infinity).map(x=>x.value.TOTAL)); 
    }) 

そして実際、我々はCDをクリックしたときに我々は以下を参照してください

[200, 370.3, 2.842170943040401e-14] 

したがって、このようなnon_zero_pred書く:

function non_zero_pred(d) { 
    return Math.abs(d.value.TOTAL) > 0.0001; 
    } 

ゼロがなくなった:https://jsfiddle.net/3fovopxp/7/

私は今FAQを修正するつもりです...

+0

うわー...私は今日何か新しいことを学びました。ありがとうゴードン。 –

関連する問題