2014-08-29 3 views
0

У меня есть размер Crossfilterjs на ключе, соответствующем объекту.Неожиданное поведение с использованием группы в Crossfilterjs

Я группирую один из атрибутов объекта и использую reduceCount(), чтобы найти количество значений для этого атрибута, но результаты не то, что я ожидал.

Мой код:

<!DOCTYPE html> 
<meta charset="utf-8"> 
<script src="//cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.9/crossfilter.min.js"></script> 
<script> 
var arr = []; 

for (var i = 0; i < 100; i++) { 
    for (var j = 0; j < 100; j++) { 
     for (var k = 0; k < 100; k++) arr.push({a: i, e: { b: j, c: k}}); 
    } 
} 

var cf = crossfilter(arr), 
    a = cf.dimension(function(d) { return d.a; }), 
    e = cf.dimension(function(d) { return d.e; }); 

var counts = e.group(function(d) { return d.b; }) 
       .reduceCount() 
       .orderNatural() 
       .top(Infinity); 

console.log(counts); 

</script> 

Когда я проверяю консоль я получаю массив с объектами 67 ключ/значение.

Я ожидал получить массив с 100 объектами ключ/значение, по одному для каждого значения b.

Также некоторые из них не то, что я ожидал. Я ожидал, что все значения будут одинаковыми. Однако для большинства ключей я получаю значение 100, а для некоторых я получаю очень разные значения. Ключ 99 имеет значение 990100.

Я получил эти результаты в Google Chrome 36.0.1985.143 м.

Я раньше не использовал пользовательские функции группировки в Crossfilterjs, и кажется, что я не понимаю функциональность должным образом.

Я искал группировку по API Crossfilterjs, но это не помогло мне разобраться.

Заранее спасибо

ответ

2

покаяние

Когда я перечитал документацию я не замечал этого:

groupValue должен возвращать естественно упорядоченное значение; Кроме того, этот порядок должен быть в соответствии с функцией значения размерности в

Моя ценность группировка представляет собой строку, которая имеет естественный порядок, но мое измерение создается на объект, который не делает. Несоответствие между заказами должно быть причиной проблемы.

Затем я заметил еще один раздел в документации, которая решает проблему упорядочения на моем измерении:

crossfilter.dimension() создает новое измерение, используя указанное значение аксесса функции. Функция должна возвращать естественно упорядоченные значения, т. Е. Значения, которые корректно ведут себя относительно операторов <,, < =,> = и>. Обычно это означает примитивы: булевы, числа или строки; однако вы можете переопределить object.valueOf, чтобы обеспечить сопоставимое значение от данного объекта, например Date.

+0

Да, я уверен, что это проблема. Создание измерения на объекте, вероятно, не закончится хорошо. –

+0

В этом проблема. Я выполнил рекомендацию docs о переопределении метода valueOf для моего объекта, и теперь все работает нормально. Слишком рано принимать мой собственный ответ. Спасибо за комментарий, тем не менее. –

Смежные вопросы