пользовательские функции уменьшения в кроссфильтре на 2 поля - PullRequest
1 голос
/ 01 июля 2019

Мои данные выглядят так

field1,field2,value1,value2
a,b,1,1
b,a,2,2
c,a,3,5
b,c,6,7
d,a,6,7

Конечная цель - получить value1+value2 для каждого отдельного значения field1 и field2: {a:15(=1+2+5+7),b:9(=1+2+6),c:10(=3+7),d:6(=6)}

У меня нет хорошего способа переупорядочить эти данные, поэтому давайте предположим, что данные должны оставаться такими.

Исходя из этого предыдущего вопроса (Спасибо @Gordon), я сопоставил с помощью:

cf.dimension(function(d) { return [d.field1,d.field2]; }, true);

Но я немного озадачен тем, как написать пользовательские функции сокращения для моего варианта использования. Основной вопрос: из функций reduceAdd и reduceRemove как узнать, над какой клавишей в данный момент «работают»? т.е. в моем случае, как я узнаю, должен ли я принимать во внимание value1 или value2 в моей сумме?

(пометили dc.js и reductio, потому что это может быть полезно для пользователей этих библиотек)

Ответы [ 2 ]

1 голос
/ 02 июля 2019

ОК, поэтому я определил группу следующим образом:

reduceAdd: (p, v) => {
    if (!p.hasOwnProperty(v.field1)) {
        p[v.field1] = 0;
    }
    if (!p.hasOwnProperty(v.field2)) {
        p[v.field2] = 0;
    }
    p[v.field1] += +v.value1;
    p[v.field2] += +v.value2;
    return p;
}
reduceRemove: (p, v) => {
    p[v.field1] -= +v.value1;
    p[v.field2] -= +v.value2;
    return p;
}
reduceInitial: () => {
    return {}
}

И когда вы используете группу в диаграмме, вы просто меняете значениеAccessor на (d) => d.value[d.key] вместо обычного (d) => d.value

Небольшая неэффективность, поскольку вы храните больше данных, чем нужно в полях value, но если у вас нет миллионов различных значений, это в основном незначительно.

0 голосов
/ 01 июля 2019

у вас всегда есть хороший способ переупорядочить данные, после того как вы их извлекли и перед тем, как передать их в перекрестный фильтр;)

На самом деле, это в значительной степени обязательно, как только вы обрабатываете не строкуполя (числовые или дата)

Вы можете сделать ReduSum для нескольких полей

dimensions.reduceSum(function(d) {return +d.value1 + +d.value2; });
...