Поскольку вы группировки по дате (по вашему date dimension
), функция reduce()
будет использоваться для выполнения агрегирование , сгруппированных по дате, в соответствии с выделенными ячейками в моем примере Микки Маус ниже:
с нарастающим итогом вы должны были бы выполнять совершенно другую операцию, перекручивание вниз строки:
Вы можете агрегировать данные, а затем добавить текущее общее поле следующим образом. Я также включил пример того, как вычислить среднее значение, используя reduce
функцию:
records = [{ "date": "2014-01-01", "field1": "value1", "field2": "value11", "value_field": -20 },
{ "date": "2014-01-02", "field1": "value2", "field2": "value12", "value_field": 100 },
{ "date": "2014-01-03", "field1": "value1", "field2": "value11", "value_field": -10 },
{ "date": "2014-01-04", "field1": "value2", "field2": "value12", "value_field": 150 }
];
var cf = crossfilter(records);
var dimensionDate = cf.dimension(function (d) {
return d.date;
});
function reduceAdd(p, v) {
p.total += v.value_field;
p.count++;
p.average = p.total/p.count;
return p;
}
function reduceRemove(p, v) {
p.total -= v.value_field;
p.count--;
p.average = p.count ? p.total/p.count : 0;
return p;
}
function reduceInitial() {
return {
total: 0,
count: 0,
average: 0,
};
}
var average = dimensionDate.group().reduce(reduceAdd, reduceRemove, reduceInitial).all();
var averageWithRunningTotal = appendRuningTotal(average);
function appendRuningTotal(average) {
var len = average.length,
runningTotal = 0;
for (var i = 0; i < len; i++) {
runningTotal += average[i].value.total;
average[i].RunningTotal = runningTotal;
}
return average;
}
И это возвращает:
{"key":"2014-01-01","value":{"total":-20,"count":1,"average":-20},"RunningTotal":-20}
{"key":"2014-01-02","value":{"total":100,"count":1,"average":100},"RunningTotal":80}
{"key":"2014-01-03","value":{"total":-10,"count":1,"average":-10},"RunningTotal":70}
{"key":"2014-01-04","value":{"total":150,"count":1,"average":150},"RunningTotal":220}
Так мне удалось показать начальную нарастающий итог строку с помощью '.valueAccessor'. Но то, чего я до сих пор не хватает, - это возможность автоматического обновления текущей суммы при выборе одной из групп в других бархатах, например. Я бы хотел показать только текущее количество для выбранного значения одного из полей. Вернемся к моему примеру: какова будет общая сумма только для записей 'field1 = value1'? – Chapo
Удалил мой предыдущий комментарий, где я сказал спасибо :) – Chapo
Вы можете просто изменить значение p.total в функциях уменьшения, чтобы посмотреть на поле1. Итак, из этого: 'p.total + = v.value_field;' Для этого: 'p.total + = v.value1;' Если вы хотите получить итоговые значения всех своих полей, то просто создайте для них новые переменные в 'reduceInital 'и назначать им функции' reduceAdd' и 'reduceRemove'. :) – ninjaPixel