Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何向dc.js数据表添加百分比列?_Javascript_Dc.js_Crossfilter - Fatal编程技术网

Javascript 如何向dc.js数据表添加百分比列?

Javascript 如何向dc.js数据表添加百分比列?,javascript,dc.js,crossfilter,Javascript,Dc.js,Crossfilter,我有一个只有两列的dc.js数据表,其中一列是数字。我需要添加第三列,数字相同,但表示为占总数的百分比: 供应商得分百分比 ------- ----- ------- 查尔斯5 50.0% 莎拉4 40.0% 约翰1 10.0% 如果表是静态的,我只需计算百分比并将其添加到数据数组中,然后再将其传递给Crossfilter: let sum=data.reduce((acum,d)=>acum+d.score,0); data.forEach(d=>{d.percent=100*d

我有一个只有两列的dc.js数据表,其中一列是数字。我需要添加第三列,数字相同,但表示为占总数的百分比:

供应商得分百分比
-------  -----      -------
查尔斯5 50.0%
莎拉4 40.0%
约翰1 10.0%
如果表是静态的,我只需计算百分比并将其添加到数据数组中,然后再将其传递给Crossfilter:

let sum=data.reduce((acum,d)=>acum+d.score,0);
data.forEach(d=>{d.percent=100*d.score/sum;});
但是数据可以被过滤(使用dc.js图表和SelectMenu),例如,用户可以选择只显示女性供应商,然后表格将只显示Sarah。。。但用她以前的百分比,40%而不是重新计算到100%

我有办法解决这个问题吗?我想没有办法自动计算百分比。但是,也许我可以在数据过滤后,但dc.js重新绘制表之前,向某个事件添加一个侦听器,该事件会触发


顺便说一下,万一有什么不同。。。更糟糕的是,我没有直接处理数据维度,而是将一个伪组传递给表():

函数filteredGroup(原始组,filterFunction){
返回{
all:()=>原始组.all().filter(filterFunction),
top:n=>originalGroup.top(无穷大).filter(filterFunction.slice(0,n),
底部:n=>originalGroup.top(无穷大).filter(filterFunction.slice(-n).reverse()
};
}
设ndx=交叉滤波器(数据);
设dim=ndx.dimension(d=>d.vendor);
设grp=filteredGroup(dim.group().reduceCount(),d=>d.value>0);
dc.dataTable(“#id”)
.尺寸(grp)
.group(d=>d.someOtherField)
.showGroups(正确)
.列([d=>d.vendor,d=>d.score])
...

(我的实际数据数组将包含Charles的5个条目,Sarah的4个条目,John的1个条目。每个条目都包含更多信息,例如日期和时间,这些信息在SelectMenu中用于允许筛选。但我需要表中的聚合数据。这就是为什么我使用组而不是维度。)

这实际上很容易做到。我失去了洞察力,“团体”并不是一个神奇的东西。它只是一个具有3个函数的对象:
all
,它返回一个包含所有数据的数组;
top
bottom
,它们执行相同的操作,但只返回前N个或最后N个元素。正如Gordon在评论中指出的,每次显示表时都会调用这些函数

所以,我只需要计算假组定义中的百分比:

函数filteredGroup(原始组,filterFunction){
返回{
all:()=>calc(原始组.all().filter(filterFunction)),
top:n=>calc(originalGroup.top(无穷大).filter(filterFunction)).slice(0,n),
底部:n=>calc(originalGroup.top(无穷大).filter(filterFunction)).slice(-n).reverse()
};
}
函数计算(数据){
让总和=数据。减少((累计,d)=>累计+d.分数,0);
data.forEach(d=>{d.percent=100*d.score/sum;});
返回数据;
}

当然可以。每次显示表格时都会计算组(这就是为什么所有/顶部/底部都是函数)。因此,您可以计算原始组中的总分/分数总和,然后计算筛选组或列访问器中的百分比。今天有人问了几乎相同的问题,也许这会有帮助:谢谢戈登:)。这是非常容易做到的,我不敢相信我花了这么多时间试图弄明白这一点!我想到了团体和“假团体”,就像一些神奇的东西。。。当它们实际上非常简单的时候,只需要一个包含3个函数的对象,返回一个数据数组。太好了,谢谢您的关注!就这样,没有魔法!