okiba-gang/okiba

View on GitHub
packages/search/index.js

Summary

Maintainability
A
25 mins
Test Coverage
/**
 * @module search
 * @description Search utilities
 */

/**
 * Binary searches an array
 * @param  {Object[]|Number[]}  data   data to search
 * @param  {Number} target the value to find
 * @param  {Number} start  array index where to start from
 * @param  {Number} end    array index where to end to
 * @param  {String} [prop] property to look into (if data contains objects)
 * @return {Number}        index of the closest element found
 */
export function binarySearch(data, target, start, end, prop) {
  const middle = ~~((start + end) / 2)
  const current = prop ? data[middle][prop] : data[middle]

  if (end - 1 === start) return start

  if (target === current) return middle
  if (target > current) return binarySearch(data, target, middle, end, prop)
  return binarySearch(data, target, start, middle, prop)
}