为什么此代码只对列表中的一项进行计数,而不对其他项进行计数?

时间:2019-07-07 20:49:37

标签: javascript function d3.js dc.js

我正在尝试计算.csv文件中“经理”的“ MIT”和“商店”的数量。我拥有的代码可用于查找所有“经理”,但不适用于其他两个。

我已尝试将功能拆分为3个单独的功能,因为我认为问题可能是在一个功能中使用了多个dc.numberDisplay,但这没有用。我已经尝试过该功能,所以只有一个功能,如果它正在寻找可以工作的Managers,那么MIT则不会,而Instores则不会。我尝试过更改代码的顺序,但还是一无所获。我已将console.log(p.mit_count)放在add_item,remove_item和初始化的每一行中。我已将console.log(d.value.mit_count)放在valueAccessor中。

Scott,Instore,3,BMC,96
Mark,Instore,4,Intro,94
Wendy,Instore,3,Intro,76
Lucas,Instore,2,Intro,96
    .defer(d3.csv, "data/Results.csv")
    .await(makeGraphs)

//function for making and rendering graphs
function makeGraphs(error, staffData) {
    var ndx = crossfilter(staffData);
    show_number_of_staff(ndx);
    dc.renderAll();
}

function show_number_of_staff(ndx) {
    var dim = ndx.dimension(dc.pluck('Rank'));

    function add_item(p, v) {
        if (v.Rank == "Manager") {
            p.manager_count++;
        }
        else if (v.Rank == "MIT") {
            p.mit_count++;
        }
        else if (v.Rank == "Instore") {
            p.instore_count++;
        }
        return p;
    }

    function remove_item(p, v) {
        if (v.Rank == "Manager") {
            p.manager_count--;
        }
        else if (v.Rank == "MIT") {
            p.mit_count--;
        }
        else if (v.Rank == "Instore") {
            p.instore_count--;
        }
        return p;
    }

    function initialise(p, v) {
        return { manager_count: 0, mit_count: 0, instore_count: 0 };

    }

    var staffCounter = dim.group().reduce(add_item, remove_item, initialise);;

    dc.numberDisplay("#managerCount")
        .formatNumber(d3.format(".0"))
        .valueAccessor(function(d) {
            return d.value.manager_count;
        })
        .group(staffCounter);

    dc.numberDisplay("#mitCount")
        .formatNumber(d3.format(".0"))
        .valueAccessor(function(d) {
            return d.value.mit_count;
        })
        .group(staffCounter);

    dc.numberDisplay("#instoreCount")
        .formatNumber(d3.format(".0"))
        .valueAccessor(function(d) {
            return d.value.instore_count;
        })
        .group(staffCounter);
}

console.log(p.mit_count)显示它计数到13(正如我期望的那样),但是随后在valueAccessorconsole.log(d.value.mit_count)显示为0。我不知道为什么该方法适用于“经理”但没有别的。我花了整整一个星期的时间使我几乎感到尴尬。好像很简单!

1 个答案:

答案 0 :(得分:1)

我认为,如果您登录staffCounter.all(),您会发现它在3个单独的箱中计入经理,MIT和Instore。这是因为您的维度按Rank进行排序,然后您的组再次按Rank进行分箱,因此最终每个等级只有一个分箱。

通常,您会希望将groupAll object(带有一个垃圾箱)传递给numberDisplay。但是,这是允许的,也将接受具有多个容器(source)的普通组。它将对垃圾箱进行排序,并取出最后一个。

为什么?我不确定。我认为几乎在每种情况下,您都希望减少到一个垃圾箱,但是显然有人在用例中希望显示许多垃圾箱中的最大价值。

我惊讶地发现该行为没有记录,因此我更新了the numberDisplay documentation

使用groupAll,您的代码将类似于:

var staffCounter = ndx.groupAll().reduce(add_item, remove_item, initialise);
dc.numberDisplay("#managerCount")
    .formatNumber(d3.format(".0"))
    .valueAccessor(function(d) {
        return d.manager_count; // no .value here
    })
    .group(staffCounter);

请注意,此处未使用交叉过滤器尺寸。