JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで時間帯の重複(オーバーラップ)をチェックする方法

時間帯の重複チェックとは

JavaScriptでは、開始時刻と終了時刻のペアからなる「時間帯(インターバル)」の配列を受け取り、その中に重複している時間帯が存在するかどうかを判定する関数を実装することがよくあります。スケジュール管理や予約システムなどで役立つ典型的な処理です。

例として、次のような配列を考えてみましょう。各オブジェクトは start(開始時刻)と end(終了時刻)を持ちます。

const arr = [
  { start: '01:00', end: '04:00' },
  { start: '05:00', end: '08:00' },
  { start: '07:00', end: '11:00' },
  { start: '09:30', end: '18:00' },
];

この配列内のすべての時間帯を互いに比較し、1つでも重複する組み合わせが見つかった時点で処理を中断して true を返します。すべての組み合わせに重複がなければ false を返します。

ここでいう「重複する時間帯」とは、何らかの共通の時間を持つ区間のことです。上記の例では「05:00〜08:00」と「07:00〜11:00」が 07:00〜08:00 の部分で重なっているため、結果は true になります。

実装コード

const arr = [
  { start: '01:00', end: '04:00' },
  { start: '05:00', end: '08:00' },
  { start: '07:00', end: '11:00' },
  { start: '09:30', end: '18:00' },
];

const overlapping = (a, b) => {
  const getMinutes = s => {
    const p = s.split(':').map(Number);
    return p[0] * 60 + p[1];
  };
  return getMinutes(a.end) > getMinutes(b.start) && getMinutes(b.end) > getMinutes(a.start);
};

const isOverlapping = (arr) => {
  let i, j;
  for (i = 0; i < arr.length - 1; i++) {
    for (j = i + 1; j < arr.length; j++) {
      if (overlapping(arr[i], arr[j])) {
        return true;
      }
    }
  }
  return false;
};

console.log(isOverlapping(arr));

コードの解説

  • getMinutes 関数:「HH:MM」形式の時刻文字列をコロンで分割し、分単位の数値に変換します。例えば「01:30」なら 90 を返します。文字列のまま比較すると誤判定の原因になるため、必ず数値化してから比較するのがポイントです。
  • overlapping 関数:2つの時間帯 a・b を受け取り、a.end > b.start かつ b.end > a.start という条件で重複を判定します。この不等式による判定は、2つの区間が交差しているかどうかを確認する定番の手法で、簡潔かつ高速に動作します。
  • isOverlapping 関数:二重ループですべてのペア(i と j の組み合わせ)を比較します。重複が見つかった時点で即座に true を返すことで、それ以降の不要な比較をスキップしています。

実行結果

コンソールには次のように出力されます。

true

これは、配列内に少なくとも1組の重複する時間帯が存在することを意味します。もしすべての時間帯が互いに重ならなければ、false が出力されます。

  1. JavaScriptで配列の要素が2乗の関係かどうかをチェックする方法

    問題 2つの数値の配列 arr1 と arr2 をそれぞれ第1・第2引数として受け取るJavaScript関数を作成することを考えます。 この関数は、arr2 のすべての要素が、出現順序に関係なく arr1 のいずれかの要素の2乗と一致する場合にのみ true を返し、それ以外の場合は false を返す必要があります。 たとえば、関数への入力が次のようであった場合を考えてみましょう。 入力 const arr1 = [4, 1, 8, 5, 9]; const arr2 = [81, 1, 25, 16, 64]; 出力 const output = true; この場合、81 = 9²、

  2. JavaScriptで行列の対角線がすべて同じ要素かどうかを判定する方法

    問題概要 リテラルを要素とする2次元配列 arr を第一引数(唯一の引数)として受け取るJavaScript関数を作成します。 この関数の役割は、行列の左上から右下へ向かうすべての対角線が同じ要素で構成されているかどうかを判定することです。これは、いわゆる「トゥーマトリックス(Toeplitz行列)」と呼ばれる行列の判定問題に相当します。 条件を満たしていれば true を、そうでなければ false を返します。 例として、次の入力を関数に渡した場合を考えてみましょう。 入力 const arr = [ [6, 7, 8, 9], [2, 6, 7, 8], [1,