2016-08-16 2 views
0

私はこれに数日間執着しており、JavaScriptの日付はかなり混乱しています。 2時間以上先で2ヶ月以上先のJSONとフィルタオブジェクトを繰り返し処理する必要があります。ここJavascriptの日付をアレイ内のオブジェクトにフィルタする方法を教えてください。

は、JSONの例である:

[ 
    { 
     "Email":"[email protected]", 
     "TimeSlotsDate":"2017-01-28", 
     "TimeSlotsAvailable":[ 
     { 
      "start":"11:00", 
      "end":"12:00" 
     }, 
     { 
      "start":"12:00", 
      "end":"13:00" 
     }, 
     { 
      "start":"13:00", 
      "end":"14:00" 
     }, 
     { 
      "start":"15:00", 
      "end":"16:00" 
     }, 
     { 
      "start":"16:00", 
      "end":"17:00" 
     }, 
     { 
      "start":"17:00", 
      "end":"18:00" 
     } 
     ], 
    }, 
    { 
     "Email":"[email protected]", 
     "TimeSlotsDate":"2017-02-01", 
     "TimeSlotsAvailable":[ 
     { 
      "start":"12:00", 
      "end":"13:00" 
     }, 
     { 
      "start":"13:00", 
      "end":"14:00" 
     }, 
     { 
      "start":"14:00", 
      "end":"15:00" 
     }, 
     { 
      "start":"15:00", 
      "end":"16:00" 
     }, 
     { 
      "start":"16:00", 
      "end":"17:00" 
     }, 
     { 
      "start":"17:00", 
      "end":"18:00" 
     } 
     ], 
    }] 

私はJSONから使用可能な日付を作成しますが、私は、私はあまりありTimeSlotsAvailable配列からオブジェクトを削除する部分で立ち往生しています機能を書かれています前述のように2時間前と2ヶ月以上先行している。ここ

関数である:

var filterTimeslots = function (_timeSlots) { 

    var result = []; 
    var currentDate = new Date(); 
    var timeZoneOffset = currentDate.getTimezoneOffset()/60; 

    for (var i in _timeSlots) { 
     var day = _timeSlots[i].TimeSlotsDate.substring(8, 10); 
     var month = _timeSlots[i].TimeSlotsDate.substring(5, 7); 
     var year = _timeSlots[i].TimeSlotsDate.substring(0, 4); 

     for (var x in _timeSlots[i].TimeSlotsAvailable) { 
      var timeSlotStrt = _timeSlots[i].TimeSlotsAvailable[x].start.substring(0, 2); 
      var timeZoneTime = parseInt(timeSlotStrt) - timeZoneOffset; 

      var timeSlotDate = new Date(year, month, day, timeZoneTime); 

      if (timeSlotDate < currentDate) { 
       //the timeslot is less than 2 hours away 
      } 

      if (timeSlotDate > currentDate) { 
       //the timeslot is more than 2 months ahead 
      } 

      return result; 
     } 
    } 
}; 

機能が無効なタイムスロットを排除濾過配列を返さなければなりません。

ご協力いただければ幸いです。

+1

簡単なはずの瞬間を使用して – jcubic

答えて

0

私はhttp://momentjs.com/のようなライブラリを使用することをお勧め

var arr = [{ 
 
    "Email": "[email protected]", 
 
    "TimeSlotsDate": "2016-08-16", 
 
    "TimeSlotsAvailable": [{ 
 
    "start": "17:00", 
 
    "end": "18:00" 
 
    }], 
 
}, { 
 
    "Email": "[email protected]", 
 
    "TimeSlotsDate": "2017-02-08", 
 
    "TimeSlotsAvailable": [{ 
 
    "start": "11:00", 
 
    "end": "12:00" 
 
    }, { 
 
    "start": "12:00", 
 
    "end": "13:00" 
 
    }, { 
 
    "start": "13:00", 
 
    "end": "14:00" 
 
    }, { 
 
    "start": "15:00", 
 
    "end": "16:00" 
 
    }, { 
 
    "start": "16:00", 
 
    "end": "17:00" 
 
    }, { 
 
    "start": "17:00", 
 
    "end": "18:00" 
 
    }], 
 
}, { 
 
    "Email": "[email protected]", 
 
    "TimeSlotsDate": "2017-02-01", 
 
    "TimeSlotsAvailable": [{ 
 
    "start": "12:00", 
 
    "end": "13:00" 
 
    }, { 
 
    "start": "13:00", 
 
    "end": "14:00" 
 
    }, { 
 
    "start": "14:00", 
 
    "end": "15:00" 
 
    }, { 
 
    "start": "15:00", 
 
    "end": "16:00" 
 
    }, { 
 
    "start": "16:00", 
 
    "end": "17:00" 
 
    }, { 
 
    "start": "17:00", 
 
    "end": "18:00" 
 
    }], 
 
}]; 
 
var now = moment(); 
 
var start = now.clone().add(2, 'hours'); 
 
var end = now.clone().add(2, "months"); 
 
console.log("NOW: ",now); 
 
console.log("START: ",start); 
 
console.log("END: ",end); 
 
var res = arr.filter(function(el) { 
 
    return el.TimeSlotsAvailable.filter(function(subEl) { 
 
    var c = moment(el.TimeSlotsDate + " " + subEl.start); 
 
    return c >= start && c <= end; 
 
    }).length == el.TimeSlotsAvailable.length; 
 
}); 
 
console.log(res.length, res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

関連する問題