summ all the values of a field using crossfilter?

given this dataset here

Date    Origin  Destination Delay (mins)
03/01/2001 13:05:00 MCI MDW 8
03/01/2001 13:45:00 LAS PHX 95
03/01/2001 18:30:00 LAX PHX 10
03/01/2001 18:30:00 ONT PHX 0
03/01/2001 18:30:00 LAS LAX -9
03/01/2001 18:30:00 LAX OAK 12
03/01/2001 18:40:00 ONT SMF -8
03/01/2001 19:00:00 MDW BNA -1
03/01/2001 19:00:00 OAK LAX -10
03/01/2001 19:00:00 LAS LAX -11
...

How do I sum all the values in the Delay field? I know there is minus values, I am just using this as an example.

I was thinking of using crossfilter to do this but not sure if there is a simplar way of doing this just writing a javascript function. for instance I can get the total records/rows with below which is 2692

cf.size()
//2692

NOTE
Bring up console mode (Ctrl-shift-I) and type cf.size()
the crossfilter is already defined in the source code(Ctrl-U) var cf = crossfilter(data);


EDIT1

using d3.sum

d3.sum(data,function(d){return d.delay;})
30632

using array.reduce - see JavaScript Array.prototype.reduce -what is the 0?

data.reduce(function(total,d){ return total+ d.delay }, 0)
30632

using crossfilter, but this is just using the reduce above on a crossfilter delay dimension var delayDimension = cf.dimension(function(d) {return d.delay;});

delayDimension.top(Infinity).reduce(function(total,d){ return total+ d.delay }, 0)
30632

NOTE:

This returns the delay value in the last element:

data.reduce(function(total,num){ return num.delay })
165

EDIT2

adapting on this: Custom calculated aggregated field in Crossfilter

create a dimension:

origin=cf.dimension(function(d) { return d.origin; })

create my reduceAdd, reduceMove, and reduceInitial functions:

var reduceAdd = function(p, v) {
    p.delay += v.delay;
    return p;
}

var reduceRemove = function(p, v) {
    p.delay -= v.delay;
    return p;
}

var reduceInitial = function() {
    return {
        delay : 0
    }
}

Example output from console:

var json = origin.group().reduce(reduceAdd,reduceRemove,reduceInitial).orderNatural().top(Infinity);
undefined
json
[Objectkey: "ALB"value: Objectdelay: -1__proto__: Object__proto__: Object, Objectkey: "AMA"value: Objectdelay: 171__proto__: Object__proto__: Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
json[0]
Object {key: "ALB", value: Object}
json[0].value
Object {delay: -1}

Another good one here: What are the reduceAdd, reduceSum , reduceRemove functions in crossfilter? How should they be used? but still is not exactly what I want, this is summing per category, I want a sum total eg expecting an answer of 30632 for all the delay values added together.


EDIT3

got it from the docs below printout from the console:

cf.size()
//2692

var reduceAdd = function(p, v) {
    p.delay += v.delay;
    return p;
}

var reduceRemove = function(p, v) {
    p.delay -= v.delay;
    return p;
}

var reduceInitial = function() {
    return {
        delay : 0
    }
}

cf_groupAll=cf.groupAll().reduce(reduceAdd,reduceRemove,reduceInitial)
//Object {}

cf_groupAll.value()
//Object {delay: 30632}

cf_groupAll.value().delay
//30632

You could use an jQuery Selector to get the values of the last column. Then you could use parseInt(STRING, 10) in order to parse the Integer values. Then you could easily count them together.

var $elements = $('#data tr.item td:last-child')
var sum = 0
$elements.each(function() {
  var currentValue = parseInt($(this).html(), 10)
  sum += currentValue
})
链接地址: http://www.djcxy.com/p/32694.html

上一篇: DC,Crossfilter维度:多列作为不同的键?

下一篇: 用交叉过滤器取消场地的所有值?