javascript - CrossFilter中的加权平均Reduce函数

标签 javascript crossfilter

我正在尝试根据 CrossFilter 中的两个不同维度创建加权平均值。有没有办法编写自定义reduce函数来做到这一点?我有:

function reduceAddAvg(attr) {
  return function(p,v) {
    ++p.count
    p.sum += v[attr];
        if (p.count  == 0) {            //so we don't divide by zero
            p.avg = 0;
        }else {
            p.avg = p.sum/p.count;
        }       
    return p;
  }
}
function reduceRemoveAvg(attr) {
  return function(p,v) {    
    --p.count
    p.sum -= v[attr];
        if (p.count  == 0) {
            p.avg = 0;
        }else {
            p.avg = p.sum/p.count;
        }       
    return p;
  }
}
function reduceInitAvg() {

  return {count:0, sum:0, avg:0};
}               

var rent = ndx.dimension(function(d){
    return d.rent
})
var units = ndx.dimension(function (d){
    return d.units
})
var hood = ndx.dimension(function (d) {
    return d.hood;
});   

我的数据如下所示:

records = [{"hood":"SF","rent":"1000","units":"4"},
          {"hood":"NYC","rent":"1200","units":"5"},
          {"hood":"SF","rent":"1400","units":"8"},
          ]

我想退还租金,按单位(租金 * 单位)/单位加权,因此结果如下:

    {"key":"SF","value": (1000 * 4 + 1400 * 8) / (4+8)}
    {"key":"NY,"value": 1200}

Crossfilter 支持这个吗?我将如何编写自定义reduce函数来实现这个?

最佳答案

这就是您要找的...

records = [{"hood":"SF","rent":1000,"units":4},
      {"hood":"NYC","rent":1200,"units":5},
      {"hood":"SF","rent":1400,"units":8}];

var ndx = crossfilter(records);
var hoodDim = ndx.dimension(function (d) {
return d.hood;
});
var hoodGroup = hoodDim.group().reduce(
function reduceAdd(p, v) {
    p.sumOfProds += (v.rent * v.units);
    console.log("sumOfProds", p.sumOfProds);
    p.unitsSum += v.units;
    console.log("unitsSum", p.unitsSum);
    p.finalVal = p.sumOfProds / p.unitsSum;
    return p;
},
function reduceRemove(p, v) {
    p.sumOfProds -= (v.rent * v.units);
    p.unitsSum -= v.units;
    p.finalVal = p.unitsSum ? p.sumOfProds / p.unitsSum : 0;
    return p;
},
function reduceInitial() {
    return { sumOfProds:0, unitsSum:0, finalVal:0 };
                                           });
hoodGroup.top(Infinity).forEach(function(d){ console.log(d.key, d.value.finalVal); });

这是一个JSFiddle如果需要的话。

关于javascript - CrossFilter中的加权平均Reduce函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29510641/

相关文章:

javascript - Node.js console.log(object) 打印空对象

javascript - 在 crossfilter 中过滤多个离散值

javascript - DC.js + Crossfilter 设置手动过滤后图表的事件项

d3.js - 图例标签和颜色更改为黑色 dc.js d3.js

javascript - dc.js:多维过滤器

javascript - 对 jQuery 加载的 div 中的 li 进行排序

javascript - 扫雷显示附近的瓷砖功能

javascript - dest.write 不是 gulp 中带有 broswerify 的函数

javascript - jQuery UI 可拖动随机停止工作?

javascript - dc.js x 轴不刷新