繁体   English   中英

比较两个arrays的对象,判断第一个数组的日期是否在第二个数组Javascript的指定范围内

[英]Compare two arrays of objects and find out if the date from the first array is within the specified range in the second array in Javascript

let array1 = [
    {
        start_date: 2022-12-01,
        end_date: 2022-12-07,
        status: ready,
    },
    {
        start_date: 2022-12-04,
        end_date: 2022-12-10,
        status: ready,
    },
    
   {
        start_date: 2022-12-8,
        end_date: 2022-12-14,
        status: ready,
    },
    {
        start_date: 2022-12-11,
        end_date: 2022-12-17,
        status: ready,
    },
   {
        start_date: 2022-12-15,
        end_date: 2022-12-21,
        status: overlap,
    },

   {
        start_date: 2022-12-18,
        end_date: 2022-12-24,
        status: overlap,
    },

   {
        start_date: 2022-12-22,
        end_date: 2022-12-28,
        status: overlap,
    },
    {
        start_date: 2022-12-25,
        end_date: 2022-12-31,
        status: overlap,
    },
    
    {
        start_date: 2022-12-18,
        end_date: 2022-12-31,
        status: match,
    },

    
];




let array2 = [
    {
        start_date: 2022-12-18,
        end_date: 2022-12-31
    }
];

我有两个对象数组和

  1. 想要将数组 1 的开始日期与数组 2 进行比较,以查看数组 1 的开始日期是否在数组 2 的开始日期和结束日期的范围内

然后还将数组 1 的结束日期与数组 2 进行比较,以查看数组 1 的结束日期是否在数组 2 的开始日期和结束日期的范围内

如果满足上述两个条件,则验证数组 1 状态是否重叠。

例如:Dec 15-21(数组 1 - 开始日期 - 结束日期) Dec 18-31(从数组 2 开始日期 - 结束日期)

  1. 如果数组 1 的开始日期在数组 2 的开始和结束日期范围之外,则验证数组 1 的状态是否已就绪。 如果数组 1 结束日期超出数组 2 开始和结束日期的范围,则验证数组 1 状态已准备就绪。

例如:Dec 01-07(数组 1 - 开始日期 - 结束日期) Dec 18-31(从数组 2 开始日期 - 结束日期)

  1. 如果数组 1 的开始日期与数组 2 的开始日期匹配,并且数组 1 的结束日期与数组 2 的结束日期匹配,则验证数组 1 的状态是否匹配,

例如:Dec 18-31(数组 1 - 开始日期 - 结束日期) Dec 18-31(从数组 2 开始日期 - 结束日期)

您能否告知如何使用 javascript 实现此目的。

如果有一种方法可以验证每个块中的状态是否重叠/就绪/可用,或者使每个块返回状态而不仅仅是 boolean 值 - 真/假

let compareTwoArrayOfObjects = (
    array1,
    array2
) => {
    return (
        array2.every((element_2) =>
            array1.every(          
                (element_1) => {

                    if(element_2.start_date < element_1.start_date && element_1.start_date < element_2.end_date) return OVERLAP;
                    if(element_2.start_date < element_1.end_date && element_1.end_date < element_2.end_date) return OVERLAP;
                    
                     
>! if(element_2.start_date == element_1.start_date && element_1.start_date == element_2.end_date) return MATCH;
>! 
>! 
>! if(element_2.start_date > element_1.start_date && element_1.start_date > element_2.end_date) return ready;
>! if(element_2.start_date > element_1.end_date && element_1.end_date > element_2.end_date) return ready;
>!                 }
            )
        )
    );
};

这应该可以解决问题,第一个 if 只是比较时间是否相同,第二个 if 语句是第一个数组日期中的任何一个在第二个数组的范围内或者第二个数组中的任何日期是否存在的条件在第一个数组的当前选中元素的范围内,最后一个if是第一个日期在第二个日期范围之外的条件:

 let array1 = [{ start_date: "2022-12-01", end_date: "2022-12-07", }, { start_date: "2022-12-04", end_date: "2022-12-10", }, { start_date: "2022-12-8", end_date: "2022-12-14", }, { start_date: "2022-12-11", end_date: "2022-12-17", }, { start_date: "2022-12-15", end_date: "2022-12-21", }, { start_date: "2022-12-18", end_date: "2022-12-24", }, { start_date: "2022-12-22", end_date: "2022-12-28", }, { start_date: "2022-12-25", end_date: "2022-12-31", }, { start_date: "2022-12-18", end_date: "2022-12-31", }, ]; let array2 = [{ start_date: "2022-12-18", end_date: "2022-12-31" }]; function compareTwoArrayOfObjects(array1, array2) { const start2 = new Date(array2[0].start_date); const end2 = new Date(array2[0].end_date); return array1.map(elm_arr1 => { const start1 = new Date(elm_arr1.start_date); const end1 = new Date(elm_arr1.end_date); let status; if (start1.getTime() === start2.getTime() && end1.getTime() === end2.getTime()) { status = "match"; } else if ((start1 > start2 && start1 < end2) || (end1 > start2 && end1 < end2) || (start2 > start1 && start2 < end1) || (end2 > start1 && end2 < end1)) { status = "overlap"; } else if ((start1 < start2 && end1 < start2) || (start1 > end2 && end1 > end2)) { status = "ready"; } return {...elm_arr1, status, }; }); } console.log(compareTwoArrayOfObjects(array1, array2));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM