Хочу написать кастомный метод массива findIndexBinary, реализующий бинарный поиск элемента с возвратом его индекса. Но не могу понять, как внутри самого метода получить доступ к заданному элементу.
В чистом виде сама функция выглядит так
const searchBinary = (nums, target) => {
let left = 0
let right = nums.length - 1
let middle
while (left <= right) {
middle = Math.round((right - left) / 2) + left
if (target === nums[middle]) {
return middle
} else if (target < nums[middle]) {
right = middle - 1
} else {
left = middle + 1
}
}
return -1
}
Я пробовал сделать следующий вариант (см ниже). И если с первым if внутри while все понятно, то что должно быть в else if? Пока хардкодом продублировал внутри while константу target, но ведь от нее нужно как-то избавиться. Иначе говоря, как получить этот target, чтобы сравнить с this[middle] ведь он внутри коллбэк функции?
Array.prototype.findIndexBinary = function(callback) {
let left = 0
let right = this.length - 1
let middle
while (left <= right) {
middle = Math.round((right - left) / 2) + left
// Этой константы тут, разумеется, быть не должно
const target = 10
if (callback(this[middle], middle, this)) {
// вместо if (target === this[middle]) {
return middle
// а вот что должно быть в качестве условия else if - непонятно
} else if (target < this[middle]) {
right = middle - 1
} else {
left = middle + 1
}
}
return -1
}
const elementIndex = nums.findIndexBinary(el => el === 10)