如何使用开始日期和结束日期筛选具有多个条件的记录

时间:2019-06-04 10:22:58

标签: javascript

我正在我的angular 7应用程序中从服务器请求以下数组。

var data =  [{
  "ProjectID": "09fbeda6-860e-11e9-a8cd-38607725a846",
  "StartDate": "2018-12-11T18:30:00.000Z",
  "EndDate": "2019-01-11T18:30:00.000Z",
  "Name": "Test filters"
},
{
  "ProjectID": "01418e66-85f3-11e9-a8cd-38607725a846",
  "StartDate": "2019-06-02T18:30:00.000Z",
  "EndDate": "2019-06-27T18:30:00.000Z",
  "Name": "Sang"
},
{
  "ProjectID": "ad38f7ce-85e7-11e9-a8cd-38607725a846",
  "StartDate": "2019-06-02T18:30:00.000Z",
  "EndDate": "2019-11-28T18:30:00.000Z",
  "Name": "Arun_Viewer_test"
}];

并且我具有以下功能,它将接受动态键和值以过滤数据。

filterBy = { Name: ["Filters"]}; // to search based on dynamic key and value
 result = data.filter(function (o) { 
    return Object.keys(filterBy).every(function (k) {
        return filterBy[k].some(function (f) {
            return (o[k].toLowerCase()).includes(f.toLowerCase());
        });
    });
});
console.log(result);

ES6的替代方法,可提供与上述功能相同的输出

result = data.filter(o => Object.keys(filterBy).every(k => filterBy[k].some(f => (o[k].toLowerCase()).includes(f.toLowerCase()))));

控制台中的结果是打印,并且功能正常。

但是我想过滤项目是否在给定的startdate和enddate之间,它应该包含项目名称。 简而言之,我必须应用两个过滤器,项目应包含给定名称,项目应在给定的开始日期和结束日期之间

filterBy = { Name: ["Filters"], StartDate: ["new Date(12/31/2018)"], EndDate: ["new Date(31/07/2019)"]}

1 个答案:

答案 0 :(得分:-1)

这不是最理想的选择,但在您的情况下为this should work

  • 将过滤条件构建为键值对数组。
  • 具有此结构的过滤器记录作为过滤器的谓词。

const filterCriteria = [{{key:'Name',value:'blah'}},{key:'StartDate',value:'blah1'},{key:'EndDate',value:'blah2'}];

const filteredValues = records.filter(record => {
    let filtered = true;
        filterCriteria.forEach(criteria => {
        if (filtered && record[criteria.key] !== criteria.value) {
            filtered = false;
        }
    })
    return filtered;
});

可以使用更高阶的函数来改进此解决方案。