#javascript #crossfilter
#javascript #перекрестный фильтр
Вопрос:
Я пытаюсь использовать библиотеку JavaScript Crossfilter для действительно большого набора данных. Я упростил данные для этого вопроса.
var tempArray = [
{"date": new Date(2013, 6),"dataval":400,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date": new Date(2013, 6),"dataval":400,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date": new Date(2013, 6),"dataval":400,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date": new Date(2013, 6),"dataval":400,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date": new Date(2013, 6),"dataval":600,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date": new Date(2013, 6),"dataval":600,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date":new Date(2013, 6),"dataval":600,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date":new Date(2013, 6),"dataval":600,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":200,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":200,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":200,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":200,"col1":"Test 1","col2":"Billy Recycling Group","col3":"Billy Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":300,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":300,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":300,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"},
{"date":new Date(2014, 6),"dataval":300,"col1":"Test 2","col2":"James Recycling Group","col3":"James Recycling Group - Mobile"}
]
//**********************************************************************************
// Creating Crossfilter
//**********************************************************************************
var data = crossfilter(tempArray);
//**********************************************************************************
// Getting Dimension by Company Name
//**********************************************************************************
var dimensionByName = data.dimension(function (d) {return d.col1})
//**********************************************************************************
// Getting Dimension by Date
//**********************************************************************************
var dimensionByDate = data.dimension(function (d){return d.date})
//**********************************************************************************
// Dimension by Company name that I can use to get Data
//**********************************************************************************
var dim = data.dimension(function (d) {return d.col1})
dimensionByDate.filter(new Date(2014, 6))
var thisMonthMeasure = dim.group().reduceSum(function (d){return d.dataval});
console.log('thisMonthMeasure', thisMonthMeasure.top(Infinity))
//**********************************************************************************
// Clearing Data Filter
//**********************************************************************************
dimensionByDate.filterAll();
dimensionByDate.filter(new Date(2013, 6))
var lastYearMeasure = dim.group().reduceSum(function (d){return d.dataval});
console.log('lastYearMeasure', lastYearMeasure.top(Infinity))
Проблема в том, что мой код выводит на консоль один и тот же массив дважды вместо двух разных массивов. Значения точно такие же, поэтому результаты таковы:
thisMonthMeasure
равно [ { key: "Test 2", value : 3600 } , { key: "Test 1", value : 2400 } ]
lastYearMeasure
равно [ { key: "Test 2", value : 3600 } , { key: "Test 1", value : 2400 } ]
… вместо ожидаемых результатов ниже:
thisMonthMeasure
равно [ { key: "Test 2", value : 1200 } , { key: "Test 1", value : 800 } ]
lastYearMeasure
равно [ { key: "Test 2", value : 2400 } , { key: "Test 1", value : 1600 } ]
После некоторого дополнительного тестирования кажется, что мой фильтр дат не работает.
Как я должен фильтровать по датам?
Ссылка на JSFiddle http://jsfiddle.net/TheMcMurder/u89Wv /
Ответ №1:
Мне кажется, что ваш атрибут ‘date’ в ваших данных представляет собой строку, но вы пытаетесь отфильтровать ее с помощью объекта Date. Это точно? Я не думаю, что это сработает. Может быть, попробовать
dimensionByDate.filter("2014-07-01T06:00:00.000Z");
Комментарии:
1. Это не так. На самом деле я использую даты, но я обновил вопрос, чтобы он был немного более четким
2. Группы обновляются после их записи в консоль. Если вы запишете фактические значения, вы увидите, что они меняются: jsfiddle.net/u89Wv/2 На самом деле для этого вам нужна только одна группа — значения группы обновляются по мере применения различных фильтров.
3. Спасибо за скрипку. Это помогает.