2017-05-11 9 views
0

この質問のタイトルは、おそらく完全に適切なものではなく、はるかに説明が必要です。問題:すべてのタイムスロットのリスト(配列#1)を予約されたタイムスロットのリスト(配列#2)と比較し、利用可能なタイムスロットのリストを返します。datetimeプロパティを持つ配列の重複除外

配列は:

{ 
    "times": [ 
    { 
     "start": "2017-05-11T19:00:00.000Z", 
     "stop": "2017-05-11T19:30:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T19:30:00.000Z", 
     "stop": "2017-05-11T20:00:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T20:00:00.000Z", 
     "stop": "2017-05-11T20:30:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T20:30:00.000Z", 
     "stop": "2017-05-11T21:00:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T21:00:00.000Z", 
     "stop": "2017-05-11T21:30:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T21:30:00.000Z", 
     "stop": "2017-05-11T22:00:00.000Z" 
    } 
    ], 
    "booked": [ 
    { 
     "start": "2017-05-11T19:00:00.000Z", 
     "stop": "2017-05-11T20:30:00.000Z" 
    } 
    ] 
} 

予想および所望の結果は次のようになります。私は地図()またはalasqlを用いて、過去に同様の問題を解決してきたが、差はである

{ 
     "start": "2017-05-11T20:30:00.000Z", 
     "stop": "2017-05-11T21:00:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T21:00:00.000Z", 
     "stop": "2017-05-11T21:30:00.000Z" 
    }, 
    { 
     "start": "2017-05-11T21:30:00.000Z", 
     "stop": "2017-05-11T22:00:00.000Z" 
    } 

日時の比較誰かが私を正しい方向に向けることができますか?

私の現在の解決策はノードにありますので、ノード/ JavaScriptを使用して支援を探しています。

+2

あなたのコードを見てみましょう。 –

+0

これまでに何を試しましたか?あなたの作品を見せてください。 – Soviut

+0

これらの値は実際には日付ではなく文字列であり、並べ替えて比較することができます。例えば、 "2017-05-11T19:00:00.000Z" <"2017-05-11T19:30:00.000Z" === true; '。 –

答えて

0

これらは実際には日付オブジェクトではなく文字列であるため、任意の文字列と比較することができます。

JavaScript配列には、.map()関数と同様のインタフェースを持つ.filter()メソッドがあります。コールバック関数を与えて、関数がtrueを返した場合、元の配列の項目が保持される新しい配列を吐き出し、falseの場合はそれらを破棄します。そのような

var availableTimes = times.filter(function(time) { 
    return booked.filter(function(book) { 
    return book.start === time.start; 
    }).length > 0; 
}); 
0

何かが

function isFree(time) { 
 
    const tStart = time.start; 
 
    const tStop = time.stop; 
 
    
 
    // We order so if tStop < x.start we are sure no one of the following booking is overlapping 
 
    const occupiedSlot = t.booked.sort((a, b) => b.start - a.start); 
 
    
 
    for (let xx in occupiedSlot) { 
 
    let x = occupiedSlot[xx] 
 
    if (tStop < x.start) return true; 
 
     
 
    if (tStart > x.stop) continue; 
 
     
 
    if (tStart >= x.start && tStart < x.stop) return false; 
 
     
 
    if (tStart <= x.start && tStop > x.start) return false; 
 
    } 
 
    
 
    return true; 
 
} 
 

 
const t = { 
 
    "times": [ 
 
    { 
 
     "start": "2017-05-11T19:00:00.000Z", 
 
     "stop": "2017-05-11T19:30:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T19:30:00.000Z", 
 
     "stop": "2017-05-11T20:00:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T20:00:00.000Z", 
 
     "stop": "2017-05-11T20:30:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T20:30:00.000Z", 
 
     "stop": "2017-05-11T21:00:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T21:00:00.000Z", 
 
     "stop": "2017-05-11T21:30:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T21:30:00.000Z", 
 
     "stop": "2017-05-11T22:00:00.000Z" 
 
    } 
 
    ], 
 
    "booked": [ 
 
    { 
 
     "start": "2017-05-11T19:00:00.000Z", 
 
     "stop": "2017-05-11T20:30:00.000Z" 
 
    } 
 
    ] 
 
} 
 

 
const z = t.times.filter(isFree); 
 
console.log(z)

2

クイックarray.filterはそれを行う必要があります動作するはずです:

var s = { 
 
    "times": [ 
 
    { 
 
     "start": "2017-05-11T19:00:00.000Z", 
 
     "stop": "2017-05-11T19:30:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T19:30:00.000Z", 
 
     "stop": "2017-05-11T20:00:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T20:00:00.000Z", 
 
     "stop": "2017-05-11T20:30:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T20:30:00.000Z", 
 
     "stop": "2017-05-11T21:00:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T21:00:00.000Z", 
 
     "stop": "2017-05-11T21:30:00.000Z" 
 
    }, 
 
    { 
 
     "start": "2017-05-11T21:30:00.000Z", 
 
     "stop": "2017-05-11T22:00:00.000Z" 
 
    } 
 
    ], 
 
    "booked": [ 
 
    { 
 
     "start": "2017-05-11T19:00:00.000Z", 
 
     "stop": "2017-05-11T20:30:00.000Z" 
 
    } 
 
    ] 
 
}; 
 
    
 
    var avail = s.times.filter(function (el) { 
 
     for (var i = 0,b; b = s.booked[i]; i++) { 
 
     if (el.start < b.stop && el.stop > b.start) return false; 
 
     } 
 
     return true; 
 
    }); 
 
    
 
    console.log(avail);

関連する問題