【发布时间】:2018-05-02 06:07:49
【问题描述】:
我正在构建一个 dc.js / d3.js 仪表板,我经常需要在其中创建包含每个键的数量和每个键的总值百分比的交叉过滤器组。这就是为什么我要制作通用的 reduceAdd、reduceRemove 和 reduceInitial 函数。我设法做了前 2 个,但我不明白 reduceInitial 行为:
function reduceAdd(dim,grouping,col) {
var keys = getKeys(dim); // get the keys name in an array of string
return function(p,v) {
p.total += parseInt(v[col]); // get the running total
for (var i = 0; i < keys.length; i++) {
if(v[grouping] == keys[i]) {p[keys[i]] += +v[col];}
p[keys[i]+"perc"] = p[keys[i]]/p.total; // calculate a percentage for ech key
}
return p;
}
}
function reduceRemove(dim,grouping,col) {
var keys = getKeys(dim);
return function(p,v) {
p.total -= parseInt(v[col]);
for (var i = 0; i < keys.length; i++) {
if(v[grouping] == keys[i]) {p[keys[i]] -= +v[col];}
p[keys[i]+"perc"] = p[keys[i]]/p.total;
}
return p;
}
}
这是工作的非通用function reduceInitFC() {
return {total:0, LILOU:0, MARIUS:0,ORIANE:0,LILOUperc:0,MARIUSperc:0,ORIANEperc:0};
}
这是我尝试过的:
function reduceInit(dim) {
var keys = getKeys(dim);
var initArray= {};
initArray["total"] = 0;
for (var i = 0; i < keys.length; i++) {
initArray[keys[i]] = 0;
initArray[keys[i]+"perc"] = 0;
}
console.log(initArray); // (1)
console.log({total:0, LILOU:0, MARIUS:0,ORIANE:0,LILOUperc:0,MARIUSperc:0,ORIANEperc:0});
return function() {
return initArray;
}
}
结果是: (1) 每两次迭代的所有键的输出都为 0,而其他迭代的一些非零值 当我使用此函数时,组中的结果值与键保持不变,实际上并非如此,当我手写零值时也不是这样。
如果有人可以提供帮助,那将是超级友好和有用的。
最好, 西奥
【问题讨论】:
-
什么是
getKeys?您可以发布一个工作示例吗?我怀疑像这样使用getKeys会导致reduceAdd和reduceRemove中出现您没有意识到的错误,并且在reduceInit中还没有任何键,因此您不会得到任何值,但是如果没有一个工作示例,我就无法知道getKeys做了什么以及创建组的确切时间。 -
啊,我收回关于
getKeys引入错误的说法。虽然添加新数据时它不会更新,但这实际上很好。如果它确实更新了,您将有错误。无论如何,仍然需要一个工作示例才能有很大的机会诊断问题。 -
我可能会添加一个小提琴,但这需要一些时间,顺便说一句,这是我的 getKey 函数,它只是返回一个包含一个维度的所有键的数组:
-
function getKeys(dim) { var len = dim.group().all().length; var keys = []; for (var i = 0; i < len; i++) { keys[i] = dim.group().all()[i].key; } return keys; }
标签: javascript d3.js dc.js crossfilter