我正在尝试计算.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(正如我期望的那样),但是随后在valueAccessor
中console.log(d.value.mit_count)
显示为0。我不知道为什么该方法适用于“经理”但没有别的。我花了整整一个星期的时间使我几乎感到尴尬。好像很简单!
答案 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);
请注意,此处未使用交叉过滤器尺寸。