使用reduce删除空容器添加删除功能不起作用

时间:2017-06-04 12:24:47

标签: dc.js

我正在寻找一种解决方案,了解如何在使用reduce添加/删除功能时删除空箱。

我有一个jsfiddle here

当我想提供简单的“点数”总和时,会删除空箱,但是当我想使用平均计算并在图表中使用valueAccessor时,则不会删除空箱。

我的数据设置如下:

{Season:"2016/17",
Manager:"Alan Curtis",
Points:1,
Formation:"4231",
date:"01 February 2017"},

{Season:"2016/17",
Manager:"Paul Clement",
Points:1,
Formation:"442",
date:"01 February 2018"},

{Season:"2015/16",
Manager:"Paul Clement",
Points:3,
Formation:"433",
date:"01 May 2017"},

我的目标是提供每场比赛的积分'平均,由经理'以及'形成'。

我使用reduce添加/删除功能:

function reduceAdd(p, v) {
    p.total += v.Points;
    ++p.count;
    p.ppg = d3.round((p.total / p.count), 2);
    return p;
    }

function reduceRemove(p, v) {
    p.total -= v.Points;
    --p.count;
    p.ppg = d3.round((p.total / p.count), 2);
    return p;
    }

function reduceInitial() {
    return {
        total: 0,
        count: 0,
        ppg: 0,
        };
    }

并删除空箱代码:

function remove_empty_bins(source_group) {
return {
    all:function () {
        return source_group.all().filter(function(d) {
            return d.value !=0;
        });
    }
};
}

我的图表代码:

managerChart
    .dimension(dimManager)
    .group(ManagerPPGGroup)
    .ordering(function(p) { return -p.value.ppg })
    .renderLabel(false)
    .othersGrouper(null)
    .renderTitle(false)
    .renderTitleLabel(true)
    .margins({top: 10, left: 10, right: 20, bottom: 80})
    .valueAccessor(function(p) 
        { if (p.value.ppg >0) {
        return p.value.ppg } else { return "n/a"}; });

formationChart
    .dimension(dimFormation)
    .group(filteredFormationPPGGroup)
    .ordering(function(p) { return -p.value.ppg })
    .renderLabel(false)
    .cap(10)
    .elasticX(true)
    .renderTitle(false)
    .renderTitleLabel(true)
    .margins({top: 10, left: 10, right: 20, bottom: 80})
    .valueAccessor(function(p) { return p.value.count > 0 ? p.value.ppg : "not used"; });

除了应用过滤器时不会移除空箱,一切正常。

我尝试了各种各样的事情来解决问题,更改图表的valueAccessor和remove_empty_bins函数,但似乎没有任何效果。

我目前的解决方法是提供"未使用"图表上的文字,以便用户知道经理没有使用该表格,但我更喜欢按预期删除空箱。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

是的,如果减少产生一个对象而不是一个数字,则需要调整remove_empty_bins

我想不出任何一般的方法来做到这一点不会使它效率低下, * 所以让我们调整这个用例的函数:

function remove_empty_bins(source_group) {
    return {
        all:function () {
            return source_group.all().filter(function(d) {
                return d.value.total != 0;
            });
        }
    };
}

我们只需将.total拉出对象,因为an object (almost) never equals zero

作为奖励,我还将小条设置为固定高度:

formationChart
    .fixedBarHeight(30)

否则当有一个酒吧时,它会变得适合整个区域,很多人都认为这个区域很难看。

我还对管理器rowChart应用了过滤。小提琴的叉子:https://jsfiddle.net/gordonwoodhull/qw0oe8ea/6/

* 也许是时候用谓词将其重构为remove_bins()了?但是,在无箭头功能的浏览器消失之前,这一点不会简洁。