如何检查两个日期数组是否有匹配的项目?

时间:2016-09-30 08:14:03

标签: javascript arrays date vue.js

我有两个日期数组。第一个具有所有预订日期,第二个具有在"开始日期和#34;之间的日期。和"结束日"哪个用户会选择。

现在我必须确认在完整预订的日期数组中找不到开始和停止之间的天数。

我使用Vue.js更新数据。

以下是我为获取这些日期所做的工作:

          /**
           * Get dates from datepicker and format it to the same format that fully booked array has it's dates.
          **/                
            var day1 = moment( this.startDate, 'DD/MM/Y').format('Y,M,D');
            var day2 = moment( this.endDate, 'DD/MM/Y').format('Y,M,D');
            var start = new Date(day1);
            var end = new Date(day2);

          /**
           * Get dates between start and stop and return them in the dateArray.
          **/ 
            Date.prototype.addDays = function(days) {
              var dat = new Date(this.valueOf());
              dat.setDate(dat.getDate() + days);
              return dat;
            };

            function getDates(startDate, stopDate) {
              var dateArray = [];
              var currentDate = startDate;
                while (currentDate <= stopDate) {
                  dateArray.push(currentDate);
                  currentDate = currentDate.addDays(1);
                }
              return dateArray;
            }

            var dateArray = getDates(start, end);

          /**
           * Set dateArray in to Vue.js data.
          **/ 
            this.$set('daysBetweenStartStop', dateArray);

          /**
           * Get arrays of dates from the Vue.js data. calendar = Booked dates | matchingDays = Dates between start and stop.
          **/ 
            var calendar = this.fullDates;
            var matchingDays = this.daysBetweenStartStop;

          /**
            * @description determine if an array contains one or more items from another array.
            * @param {array} haystack the array to search.
            * @param {array} arr the array providing items to check for in the haystack.
            * @return {boolean} true|false if haystack contains at least one item from arr.
          */
            var findIfMatch = function (haystack, arr) {
                return arr.some(function (v) {
                    return haystack.indexOf(v) >= 0;
                });
            };
            var matching = findIfMatch(calendar, matchingDays);

          /**
           * Check the results. If false we are good to go.
          **/ 
            if (matching){
              alert('WE FOUND A MATCH');
            } else {
              alert('GOOD TO GO');
            }

数组采用以下格式:

var calendar = [
Sun Oct 02 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 09 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 16 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 23 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 30 2016 00:00:00 GMT+0300 (EEST)
]

var matchingDays = [
Fri Oct 28 2016 00:00:00 GMT+0300 (EEST),
Sat Oct 29 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 30 2016 00:00:00 GMT+0300 (EEST)
]

我的问题是即使这两个数组的日期完全相同,它们仍然会被认为是不相同的。任何想法如何使这个工作?

3 个答案:

答案 0 :(得分:1)

要从两个数组中获取匹配记录,请使用此

var calendar =  [
Sun Oct 02 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 09 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 16 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 23 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 30 2016 00:00:00 GMT+0300 (EEST)
];
var matchingDays = [
Fri Oct 28 2016 00:00:00 GMT+0300 (EEST),
Sat Oct 29 2016 00:00:00 GMT+0300 (EEST),
Sun Oct 30 2016 00:00:00 GMT+0300 (EEST)
];
var newCalendar = [];
var newMatchingDays = []
$.map(calendar, function(date){
    newCalendar.push(date.toString())
});

$.map(matchingDays, function(date){
    newMatchingDays.push(date.toString())
});

var result = [];
$.map(newCalendar, function (val, i) {
    if ($.inArray(val, newMatchingDays) > -1) {
        result.push(val);
    }
});
console.log(result);

答案 1 :(得分:1)

您的匹配功能应如下所示:

findIfMatch = function (haystack, arr){
      var i = 0;//array index
      var j = 0;//array index
      while(j < arr.length && i < haystack.length){

          cur_cal = Date.parse(haystack[i]);
          cur_match = Date.parse(arr[j]);
          if(cur_cal > cur_match){
              j++;
          }else if(cur_cal < cur_match){
              i++;
          }else{
              return true;
          }
      }
      return false;
}

答案 2 :(得分:1)

首先你无法比较那样的日期,Date是一个对象。 例如

var d1 = new Date('2016-09-30');
var d1 = new Date('2016-09-30');
console.log(d1 === d2); // = false

您需要循环数组并比较每个项目,而不是使用indexOf。 或者可以使用Array.filter()。或者使用和对象作为查找。

例如。如果说你有 - &gt;

var calendar = {
   "Sun Oct 02 2016 00:00:00 GMT+0300 (EEST)": true,
   "Sun Oct 09 2016 00:00:00 GMT+0300 (EEST)": true,
   "Sun Oct 16 2016 00:00:00 GMT+0300 (EEST)": true,
   "Sun Oct 23 2016 00:00:00 GMT+0300 (EEST)": true,
   "Sun Oct 30 2016 00:00:00 GMT+0300 (EEST)": true
};
if (calendar["Sun Oct 16 2016 00:00:00 GMT+0300 (EEST)"]) {
   console.log("We have date");
}

注意我如何使用日期的字符串表示,这也可能是一个数字,例如。来自Date.getTime()。

这里使用的是Array.filter,我认为它不像Object查找那么快。但是我们走了。

var calendar = [
   new Date('2016-09-01'),
   new Date('2016-09-12'),
   new Date('2016-09-10')
];

var finddate = new Date('2016-09-12');
var found = calendar.filter(function (a) { return a.getTime() === finddate.getTime();});

如果您不介意使用第三方库,请尝试下划线..

例如

var days = [new Date('2016-09-01'), new Date('2016-09-10'), new Date('2016-09-30')];
var finddays = [new Date('2016-09-01'), new Date('2016-09-30')];

var found = _.intersectionWith(days, finddays, 
   function (a,b) { return a.getTime() === b.getTime(); });