Использование дат в качестве фильтра с помощью Crossfilter

#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. Спасибо за скрипку. Это помогает.