2017-05-03 2 views
0

私は特定の日にイベントのリストを持っています。 、私は新しいイベント時間は午前5時以上であるように、この配列内の一つのイベントを追加する必要が特定のルールを使用してイベントの配列にイベントを挿入する

[ 
    { id: 1, start: '2017-05-01 05:00'}, 
    { id: 2, start: '2017-05-01 08:00'}, 
    { id: 3, start: '2017-05-01 14:00'}, 
    { id: 4, start: '2017-05-01 17:00'} 
] 

(イベント時間は一瞬オブジェクトである)がある場合(少なくとも3時間前のイベントの後であります)、次のイベントの3時間前(もしあれば)に表示されます。新しいイベントは同じ日に計画する必要があります。

この場合、id = 2の直後と11amに新しいイベントが挿入されます。

私は何かを始めたが、それはIFSのダースになってしまったと私は数時間の思考の後に失われてしまった。ここで

// for each event, check if there's time before or after (not less than 5am, not more than 11:59pm) 
    for(var i = 0; i < events.length; i++) { 
     var eventTime = events[i].start.clone(); 
     var before = eventTime.clone(); 
     var after = eventTime.clone(); 
     before.subtract('hours', 3); 
     after.add('hours', 3); 
     if(i == 0 && !before.hour() < 5 && !before.isBefore(date, 'day')) { 
      // first event of the day, new time cannot be before 5am and cannot be on the previous day 
      hour = before.hour(); 
     } else if(i == 0 && !after.isAfter(date, 'day')) { 
      // same as above but we test time + 3h 
     } else if(i == events.length - 1 && !after.isAfter(date, 'day')) { 
      // last event of the day, new time cannot be the next day (after 11:59pm) 
      hour = after.hour(); 
     } else if (i > 0 && i < events.length - 1) { 
      // middle events 
      // new time should be at least 3H after previous event and 3H before next event 
      // ex: 5h, 8h, 12h ok but 5h, 8h, 10h not ok or 5h, 6h, 9h not ok 
      var previousEventTime = events[i-1].start.clone(); 
      var nextEventTime = events[i+1].start.clone(); 
      if(before.hour() >= previousEventTime.hour() && after.hour() <= nextEventTime.hour()) { 

      } 
      // 
     } 
    } 

を使用することができ抜粋です。

var events = [ 
 
    { id: 1, start: 'Mon, 01 May 2017 05:00:00 +0200'}, 
 
    { id: 2, start: 'Mon, 01 May 2017 08:00:00 +0200'}, 
 
    { id: 3, start: 'Mon, 01 May 2017 14:00:00 +0200'}, 
 
    { id: 4, start: 'Mon, 01 May 2017 17:00:00 +0200'} 
 
]; 
 

 
for(var i = 0; i < events.length; i++) { 
 
     var eventTime = moment(events[i].start).clone(); 
 
     var before = moment(eventTime).clone(); 
 
     var after = moment(eventTime).clone(); 
 
     before.subtract(3, 'hours'); 
 
     after.add(3, 'hours'); 
 
     console.log(eventTime, before, after); 
 
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

+0

出力はどのようにする必要がありますか? – Weedoze

+0

イベントを挿入できる時刻を表す整数にすることができます。 (この場合は11) – gyc

答えて

0

これで1日を過ごした後、私は「数学的」解を思いついた。私のアレイにおいて

私はイベントX及びイベントZ間イベントYを挿入します。私が実施

x+3 <= y-3 || y+3 <= z-3 

一つは少し異なっている:

(前のイベントおよびz次の一つであるX)私は考え出した各イベントの間の3時間の最小値を必要とするので。真ん中に新しいイベントを挿入できるようにするには、2つのイベントの間に少なくとも6時間必要と思った。私の脳は、これまでのコードを焼損からではありません、このようになりますので

y-x > =6 || z-y >= 6 

...

 for(var i = 0; i < events.length; i++) { 
      var x = null; 
      var y = events[i].start.clone().hour(); 
      var z = null; 
      if(i > 0) { 
       x = events[i-1].start.clone().hour(); 
      } 
      if(i < events.length -1) { 
       z = events[i+1].start.clone().hour(); 
      } 
      // first event or only event 
      if(i == 0) { 
       // check if removing 3h00 doesn't cross the 5am limit 
       if(y - 3 >= 5) { 
        hour = y - 3; 
       } else if(z-y >= 6) { 
        // check if there's enough time before next event 
        hour = y + 3; 
       } 
      } 
      // middle event 
      if(x && z) { 
       if (y-x >= 6) { 
        hour = y - 3; 
       } else if (z-y >= 6) { 
        hour = y + 3; 
       } 
      } 
      // last event (can also be first if only 1 element) 
      // with !hour we make sure that a "middle" event hour is not overriden if found above 
      if(!hour && i == events.length - 1 && i != 0) { 
       // check if adding 3h00 doesn't change day (23h00) 
       if(y + 3 <= 23) { 
        hour = y + 3; 
       } else if(y-x >= 6) { 
        // check if there's enough time after previous event 
        hour = y - 3; 
       } 
      } 
     } 
     return hour; 

私はこのアルゴリズムを改良し、答えを受け入れるように喜んでいると思います。