JavaScriptで2つの範囲の重なっている範囲を取得する

(筆者が参照するために書いたコードスニペットを試験的にインターネットに置くことにしました)


range

上図の区間A - 区間B が重なる区間A-Bを求める問題(画像右側方向が正の向きとする)。a0 < a1, b0 < b1 のとき、始点は a0, b0のうち大きいほう、終点はa1, b1のうち小さいほうをとれば良い。

range2

ソースコードにすると以下の通り。なお、重複区間がないときは終点より始点のほうが大きい値をとることになるので、この場合はnullを返却することとした。

function getOverlapped(A, B) {
  const range = [
    Math.max(A[0], B[0]),
    Math.min(A[1], B[1])
  ]
  
  if (range[0] > range[1]) return null

  return range
}


// 以下の出力は [2, 3]
console.log(getOverlapped([1, 3], [2, 5])) 

// 引数を入れ替えても同じ結果が得られる
console.log(getOverlapped([2, 5], [1, 3])) 

// 以下の出力は [5, 5]
console.log(getOverlapped([2, 5], [5, 8])) 

// 重なる区間が存在しないときは null が返却される
console.log(getOverlapped([2, 5], [6, 8])) 

AやBに設定する範囲は、A[0] < A[1] , B[0] < B[1] を前提にしているので、この限りでない場合は区間の始点終点の大小関係をそろえるコードを追加する必要がある。

このカウンタは @piyoppi/counter-tools を使っています。

クリックすると匿名でいいねできます。