如何使用JS / Jquery过滤日期和JSon数据

时间:2014-05-05 13:34:42

标签: javascript jquery

我从DatePicker(End,Start)获取两个值。我想过滤数据并在这两个值之间获取数据。

但我无法让它以写作方式工作。

要关注问题,让我们考虑两个值(开始日期和结束日期)

// Here I want to 
//var myDate = new Date();
var startDate = new Date(2013, 1, 28);
var endDate = new Date(2013, 1, 30);

我的数据如下:

var filter_data = {
    "type": "FeatureCollection",
    "features": [{
        "geometry": {
            "type": "Point",
            "coordinates": [-73.98115508098644, 40.755304404503995]
        },
        "type": "Feature",
        "id": 0,
        "properties": {
            "Date": "01/20/2013 08:58:03 PM",
            "lat": 40.755304404503995,
            "lon": -73.98115508098644,
            "Address": "33 WEST 44 STREET"
        }
    },, {
        "geometry": {
            "type": "Point",
            "coordinates": [-73.968253883967947, 40.765050901514641]
        },
        "type": "Feature",
        "id": 1,
        "properties": {
            "Date": "01/29/2013 02:53:11 PM",
            "lat": 40.765050901514641,
            "lon": -73.968253883967947,
            "Address": "564 PARK AVENUE"
        }
    }, 
                ]
};

为了过滤数据,我使用了两种不同的方法,但这些方法都不起作用。

var filteredData_2 = filter_data.where( ( n, i ) => n.properties.Date <startDate && n.properties.endDate ) ;

 var filteredData = filter_data.filter(function(a){return a.properties.Date >startDate && a.properties.Date <endDate;});


console.log(filteredData_2)

console.log(filteredData)

这就像JsFiddle:

http://jsfiddle.net/dnvrw/1/

2 个答案:

答案 0 :(得分:1)

您正在将Date个对象[startDateendDate]与纯字符串进行比较。

a.properties.Date包装到正确的Date对象中:

... function(a){
  aDate = new Date(a.properties.Date);
  aDate < startDate && aDate < endDate;
})

答案 1 :(得分:1)

首先,您需要将字符串转换为JavaScript Date()对象:

function parseDate(dateString){
     var dateParts = dateString.split(' ');
     var dateArr = dateParts[0].split('/');
     var timeArr = dateParts[1].split(':');
     if(dateParts[2] === 'PM'){
         timeArr[0] += 12;   
     }
     return new Date(dateArr[0], dateArr[1], dateArr[2], timeArr[0], timeArr[1], timeArr[2]);
}

然后你需要实际过滤features数组:

 var filteredData = filter_data.features.filter(function(a){return parseDate(a.properties.Date) > startDate && parseDate(a.properties.Date) < endDate;});

编辑:moonwave99显示您可以通过将字符串作为参数传递来安全地创建Date(),从而将解决方案减少到:

 var filteredData = filter_data.features.filter(function(a){return new Date(a.properties.Date) > startDate && new Date(a.properties.Date) < endDate;});

更新了小提琴:

http://jsfiddle.net/emVJV/2/

简化答案的小提琴:

http://jsfiddle.net/2rXBN/2/