首页 > 解决方案 > jQuery如何从字典中过滤两个日期和时间,并在新数组中分组

问题描述

我使用字典数组,在这里我存储一个时间戳。

所以我有一个表,我需要按时间存储数据。

我想按时间戳和日期过滤数据。

// Dictionary array:
var array = [
        { item: "item", category: "category", dateTime: "19/05/23 05:46:33" },
        { item: "item", category: "category", dateTime: "19/05/23 05:21:33" },
        { item: "item", category: "category", dateTime: "19/05/23 06:31:33" },
        { item: "item", category: "category", dateTime: "19/05/23 06:46:33" },
        { item: "item", category: "category", dateTime: "19/05/23 07:34:33" },
        { item: "item", category: "category", dateTime: "19/05/23 07:55:33" },
        { item: "item", category: "category", dateTime: "19/05/23 08:46:33" },
        { item: "item", category: "category", dateTime: "19/05/23 09:16:33" },
        { item: "item", category: "category", dateTime: "19/05/23 09:46:33" },
        { item: "item", category: "category", dateTime: "19/05/23 10:36:33" },
        { item: "item", category: "category", dateTime: "19/05/23 11:47:33" },
        { item: "item", category: "category", dateTime: "19/05/23 11:55:33" },
        { item: "item", category: "category", dateTime: "19/05/23 12:37:33" }
    ];
// And I have time periods, for ex:
var time = ["05:45 - 06:00", "06:00 - 07:00",
     "07:00 - 08:00", "08:00 - 09:00", "09:00 - 10:00",
     "10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00",
     "13:00 - 14:00",];

//I try to use this method:
const groups = array.reduce((groups, item) => {
        const date = item.dateTime.split('T')[0];
        if (!groups[date]) {
            groups[date] = [];
        }
        groups[date].push(item);
        return groups;
    }, {});
    
    const groupArrays = Object.keys(groups).map((date) => {
        return {
            date,
            games: groups[date]
        };
    });
    
console.log(groupArrays);
但它没有以正确的方式工作,所以我需要将我在array的数据与time Schedule进行比较。

所以,最后,我想按小时接收分组日期。

最后我想收到:

 var result  = [
    { time: "05:45 - 06:00", groupedData:[
             { item: "item", category: "category", dateTime: "19/05/23 05:46:33" },
             { item: "item", category: "category", dateTime: "19/05/23 05:21:33" }
    ]
    time: "06:00 - 07:00", groupedData:[
             { item: "item", category: "category", dateTime: "19/05/23 06:31:33" },
            { item: "item", category: "category", dateTime: "19/05/23 06:46:33" }
    ]
    ];

我真的被困住了,我厌倦了寻找解决方案。

标签: javascriptjquery

解决方案


您需要解决日期格式以比较日期,我的解决方案仅包括小时,您可能需要在过滤器函数中包含分钟比较以获得准确的结果。

解释:

  1. 首先,我格式化了日期以便阅读和比较。
  2. 使用reduce函数获取分组数据。
  3. 包括一个过滤器函数,这样我们就可以在 reduce 函数中获取与当前值匹配的项目,并将项目推送到结果中。
  4. 输出结果

希望这可以帮助。

var array = [
    { item: "item", category: "category", dateTime: "19/05/23 05:46:33" },
    { item: "item", category: "category", dateTime: "19/05/23 05:21:33" },
    { item: "item", category: "category", dateTime: "19/05/23 06:31:33" },
    { item: "item", category: "category", dateTime: "19/05/23 06:46:33" },
    { item: "item", category: "category", dateTime: "19/05/23 07:34:33" },
    { item: "item", category: "category", dateTime: "19/05/23 07:55:33" },
    { item: "item", category: "category", dateTime: "19/05/23 08:46:33" },
    { item: "item", category: "category", dateTime: "19/05/23 09:16:33" },
    { item: "item", category: "category", dateTime: "19/05/23 09:46:33" },
    { item: "item", category: "category", dateTime: "19/05/23 10:36:33" },
    { item: "item", category: "category", dateTime: "19/05/23 11:47:33" },
    { item: "item", category: "category", dateTime: "19/05/23 11:55:33" },
    { item: "item", category: "category", dateTime: "19/05/23 12:37:33" }
];

var time = ["05:45 - 06:00", "06:00 - 07:00", "07:00 - 08:00", "08:00 - 09:00", "09:00 - 10:00", "10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00", "13:00 - 14:00",];
var formatedTime = time.map(function(val) {
    return val.split(" - ");
});

var grouped = formatedTime.reduce((groups, currentValue, cI) => {
    let min = parseInt(currentValue[0].substring(0,2));
    let max = parseInt(currentValue[1].substring(0,2));
    let filtered = array.filter(val => {
        let validDate = val.dateTime.replace(/\//g,'-').replace(' ','T').replace('19','2019');
        let date = new Date(validDate).getHours();
        let result = false;
        if(date >= min && date < max) {
            return true;
        } else {
            return false;
        }
    });
    

    let date = currentValue[0] + " - " + currentValue[1];
    groups.push({
        time: date,
        groupedData: filtered
    });
    return groups;

}, []);

console.log(grouped);


推荐阅读