2015-03-31 1 views
0

Я использую базовый DataTable dc.js с данными CrossFilter и пытаюсь сортировать его через атрибут Value, который является числом, но я получаю нечетное упорядочение данных.Crossfilter + dc.js DataTable не сортируется правильно

Вот является JSFiddle показывая вопрос - http://jsfiddle.net/DonalRafferty83/97mwyp0u/4/

Я настроил мои размеры CrossFilter следующим образом:

var ndx = crossfilter(data); 

var parseDate = d3.time.format("%d/%m/%Y").parse; 

data.forEach(function(d) { 
    d.date = parseDate(d.InDate); 
    d.Value = parseFloat(d.Value).toFixed(2); 
}); 

var dateDim = ndx.dimension(function(d) {return d.date;}); 
var typeDim = ndx.dimension(function(d) {return d.Type;}); 

А потом я создаю DataTable следующим образом:

var datatable = dc.dataTable("#dc-data-table"); 
datatable 
    .dimension(dateDim) 
    .group(function(d) {return "";}) 
    .size(data.length) 
    // dynamic columns creation using an array of closures 
    .columns([ 
     function(d) { return d.Id; }, 
     function(d) {return d.Indate;}, 
     function(d) {return d.Type;}, 
     function(d) {return d.Category;}, 
     function(d) {return d.Value;} 
    ]).sortBy(function(d) { 
     return d.Value; 
    }) 
    .order(d3.descending); 

Здесь как вы можете заказать заказ, так как вы можете заказать до 4000.46, что неверно:

Incorrect ordering

Это известная проблема с CrossDilter/dc.js? Или что-то я делаю неправильно? Может быть, мне нужно манипулировать моими данными, чтобы они работали правильно?

ответ

2

.toFixed(2) возвращает строку, и поэтому ваша функция sortBy сортирует строку. Поэтому верно, что «99» заказывается до «4000.46». Переключение функции sortBy на return +d.Value; (+ принудительное преобразование обратно в число) должно устранить вашу проблему.

Неподвижная версия JSFiddle: https://jsfiddle.net/j9adz6bs/

+0

Благодаря Этан, шокирует, что я пропустил это! Он работает, однако, в моем реальном наборе данных, который содержит более 100 тыс. Записей, большое значение подкрадывается вверху таблицы, например, 1.9 появляется в верхней части таблицы, а затем значение сортируется правильно, поэтому его значение равно 1.9, затем 4000 3904 и т. Д., Я не могу воспроизвести его поддельными данными, поэтому его длинный снимок, но просто интересно, могли бы вы увидеть что-то подобное раньше и знать об исправлении? –

+0

У вас когда-либо было значение null/undefined в вашем измерении даты? Это похоже на то, что может произойти, когда значение размера перекрестного фильтра естественно не упорядочено. –

+0

Спасибо, я просмотрю данные, чтобы увидеть, есть ли что-то в этом месте –