JavaScriptで2つの数値範囲の重なり(共通部分)を求める方法
JavaScriptでは、配列のペアを使って「範囲」を表現できます。例えば、[2, 5]という配列は「2から5までの範囲」を意味します。
本記事では、このように表現された2つの範囲を受け取り、その共通部分(交差している範囲)を新しい配列として返す関数の実装方法を解説します。
問題の定義
次のように、2つの範囲を表す配列が与えられたとします。
const arr1 = [2, 5]; // 2〜5 の範囲 const arr2 = [4, 7]; // 4〜7 の範囲
これら2つの範囲に共通して含まれる部分は「4から5まで」です。したがって、期待される出力は以下のようになります。
const output = [4, 5];
実装の考え方
2つの範囲の交差部分を求めるロジックは非常にシンプルです。
- 左端(開始位置):2つの範囲の開始値のうち、大きい方を採用する
- 右端(終了位置):2つの範囲の終了値のうち、小さい方を採用する
つまり、Math.max()とMath.min()を組み合わせるだけで、共通部分を計算できます。
サンプルコード
実際のコードは以下のとおりです。
const arr1 = [2, 5];
const arr2 = [4, 7];
const findRangeIntersection = (arr1 = [], arr2 = []) => {
const [el11, el12] = arr1;
const [el21, el22] = arr2;
const leftLimit = Math.max(el11, el21); // 左端は大きい方
const rightLimit = Math.min(el12, el22); // 右端は小さい方
return [leftLimit, rightLimit];
};
console.log(findRangeIntersection(arr1, arr2));実行結果
コンソールには次のように出力されます。
[ 4, 5 ]
補足:共通部分が存在しないケースへの対応
上記のコードは、2つの範囲が一切重ならない場合でも配列を返します。例えば [1, 2] と [5, 7] を渡すと [5, 2] となり、左端が右端より大きいという不正な結果になります。
実務で使う場合は、以下のように重なりの有無を判定して null を返すのが安全です。
const findRangeIntersection = (arr1 = [], arr2 = []) => {
const [el11, el12] = arr1;
const [el21, el22] = arr2;
const leftLimit = Math.max(el11, el21);
const rightLimit = Math.min(el12, el22);
// 重なりがなければ null を返す
if (leftLimit > rightLimit) return null;
return [leftLimit, rightLimit];
};
console.log(findRangeIntersection([2, 5], [4, 7])); // [ 4, 5 ]
console.log(findRangeIntersection([1, 2], [5, 7])); // nullまとめ
範囲の共通部分を求めるには、「開始値の最大値」と「終了値の最小値」を取るだけで計算できます。Math.max() / Math.min() を使えばわずか数行で実装できるため、カレンダーの予約枠チェックやデータ区間のフィルタリングなど、さまざまな場面で応用できます。
-
【JavaScript入門】オブジェクトから必要なプロパティだけを抽出する方法
JavaScriptでは、オブジェクトの一部のプロパティだけを取り出して、新しいオブジェクトを作成したい場面がよくあります。そんなときに便利なのが、分割代入(destructuring)とプロパティのショートハンド記法を組み合わせる方法です。 基本的な例 例えば、次のようなオブジェクトがあるとします。 const person = { name: John, age: 40, city: LA, scho
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>