How to filter data in AngularJS with min and max?

I have the following data:

$scope.events = [{
    "date": "2015-01-01",
    "name": "party"
}, {
    "date": "2015-02-01",
    "name": "birthday"
}, {
    "date": "2015-03-01",
    "name": "graduation"
}, {
    "date": "2015-04-01",
    "name": "wedding"
}];

      

And the user can select a date range like:

$scope.dateRange = [
    "start": "2015-01-01",
    "end": "2015-03-01"
];

      

In this case, I want to show data that is between the dates selected by the user, for example:

 $scope.selectedEvents = [{
    "date": "2015-01-01",
    "name": "party"
}, {
    "date": "2015-02-01",
    "name": "birthday"
}, {
    "date": "2015-03-01",
    "name": "graduation"
}];

      

In this case, the user has selected a date range that contains data, but if the user selects a date range that is outside of the available data, for example:

$scope.dateRange = [
    "start": "2014-12-01",
    "end": "2015-08-01"
];

      

Then I want to return the following:

$scope.events = [{
    "date": "2014-12-01",
    "name": ""
}, {
    "date": "2015-01-01",
    "name": "party"
}, {
    "date": "2015-02-01",
    "name": "birthday"
}, {
    "date": "2015-03-01",
    "name": "graduation"
}, {
    "date": "2015-04-01",
    "name": "wedding"
}, {
    "date": "2015-05-01",
    "name": ""
}, {
    "date": "2015-06-01",
    "name": ""
}, {
    "date": "2015-07-01",
    "name": ""
}, {
    "date": "2015-08-01",
    "name": ""
}];

      

+3


source to share


3 answers


After that you should start .. variables changed to non-scalable for easy js testing

var dateRange = {
    "start": "2015-04-01",
    "end": "2015-07-01"
};

var startDate = new Date(dateRange.start),
    endDate = new Date(dateRange.end);

var res = events.filter(function(item){
    var date = new Date(item.date);
    return date >= startDate && date <=endDate;
});

      



If you want to extrapolate dates, sort the defualt data by date and check the first and last values. Then create a loop to add additional elements to the main array before filtering

DEMO

+3


source


using underscore. Also add logic if the date range exceeds the number of missing values ​​with empty names

var events = [{
    "date": new Date("2015-01-01"),
    "name": "party"
}, {
    "date": new Date("2015-02-01"),
    "name": "birthday"
}, {
    "date": new Date("2015-03-01"),
    "name": "graduation"
}, {
    "date": new Date("2015-04-01"),
    "name": "wedding"
}];

//console.log(events);

var startDate = new Date("2015-01-01");
var endDate = new Date("2015-03-01");

var filteredDate = _.chain(events)
                        .filter(function(event){return event.date.getTime() >= startDate.getTime();})
                        .filter(function(event){return event.date.getTime() <= endDate.getTime();})
                        .value();


console.log(filteredDate);

      



JSFIDDLE

0


source


I updated the fiddle to add the code needed to add empty events when your range is out of the available data.

Here's the code:

var events=[{
    "date": "2015-01-01",
    "name": "party"
}, {
    "date": "2015-02-01",
    "name": "birthday"
}, {
    "date": "2015-03-01",
    "name": "graduation"
}, {
    "date": "2015-04-01",
    "name": "wedding"
}];

var dateRange = {
    "start": "2014-11-01",
    "end": "2016-01-01"
};

var startDate = new Date(dateRange.start),
    endDate = new Date(dateRange.end);

var eventsOfRange = [];
var curDate = new Date(startDate);
while(curDate <= endDate) {
    // we'll add the correct name for the dates that have an event later
    eventsOfRange.push({
        date: curDate.toISOString().substring(0, 10),
        name: ""
    });
    curDate.setUTCMonth(curDate.getUTCMonth()+1);
}


var filteredEvents = events.filter(function(item){
    var date = new Date(item.date);
    return date >= startDate && date <= endDate;
});

function find(eventsArray, date) {
    return eventsArray.reduce(function(indexFound, curEvent, index) {
        if(date === curEvent.date && indexFound === -1) {            
             return index;   
        }
        return indexFound;
    }, -1);
}

filteredEvents.forEach(function(event) {
    var index = find(eventsOfRange, event.date);
    eventsOfRange[index].name = event.name;
});

document.getElementById('pre').innerHTML = JSON.stringify(eventsOfRange, null, ' ')

      

JSFiddle

0


source







All Articles