首页 > 解决方案 > dc.js 按行值过滤

问题描述

我有一个类似于下面的数据集:

在此处输入图像描述

我想在“火车运输”上找到“海运”的总量,并用 dc.numberDisplay("#");

海运总量/火车总量

不确定我是否需要使用自定义减少。

到目前为止,我使用了下面的代码,但它返回 1

   ndx = crossfilter(data);
   var all = ndx.groupAll();

var allGroup = all.reduce(
    function (p, v) {
             
        p.total += v.total;      
        p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
        p.train = (v.shipment_type === "train") ? 0 : p.total ;
        p.air = (v.shipment_type === "air") ?0 : p.total ;

        p.sea_over_train = p.sea / p.train;
        return p;
    },
    function (p, v) {
        
        p.total -= v.total;     
        p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
        p.train = (v.shipment_type === "train") ? 0 : p.total ;
        p.air = (v.shipment_type === "air") ?0 : p.total ;

        p.sea_over_train = p.sea / p.train;
        return p;
    },
    function () {
        return {                  
            total: 0,
            sea: 0,
            train :0,
            air:0,
            sea_over_train:0,

        };
    }
);

seaOverTrain
    .group(allGroup)
    .valueAccessor(function (x) { return x.sea_over_train; })
    .formatNumber(d3.format(".3s"));

标签: dc.js

解决方案


我认为你在正确的轨道上但是

  1. 你的?:s 可能颠倒了
  2. 您可能需要计算每个类别的总数,并且
  3. 不使用总和

我们以这一行为例:

    p.sea = (v.shipment_type === "sea") ? 0 : p.total ;

如果是,这将设置p.sea为 0 ,否则将设置为。您可能希望反过来。shipment_type"sea"p.total

另外,我认为您的意图是保持海运、火车和空运的总量,因此您可以使用+=and 和-=v.total做到这一点。

目前,这些变量将从中获取总和p.total(这可能是您得到 1 的原因……不确定……)

将这些想法放在一起,我们得到:

function (p, v) {
         
    p.total += v.total;      
    p.sea += (v.shipment_type === "sea") ? v.total : 0 ;
    p.train += (v.shipment_type === "train") ? v.total : 0 ;
    p.air += (v.shipment_type === "air") ? v.total : 0 ;

    p.sea_over_train = p.sea / p.train;
    return p;
},
function (p, v) {
    
    p.total -= v.total;     
    p.sea -= (v.shipment_type === "sea") ? v.total : 0 ;
    p.train -= (v.shipment_type === "train") ? v.total : 0 ;
    p.air -= (v.shipment_type === "air") ? v.total : 0 ;

    p.sea_over_train = p.sea / p.train;
    return p;
},

推荐阅读