Вы можете использовать Array.some , чтобы проверить, совпадает ли число (и диапазон) с вашим списком, например:
Это будет O (n), и я подозреваю, что вы действительно понадобится очень большой список, чтобы оправдать создание решения типа O (1).
Мы можем go наоборот, создав массив номеров кандидатов (числа в пределах диапазона, например, для 10 + - 2 это будет [8,9,10,11,12]. NB: этот подход не будет работать для значений с плавающей запятой.
Мы проверяем каждое число на предмет принадлежности к набору, созданному из списка. Это будет все еще технически O (n), но N, скорее всего, будет маленьким (например, 5).
let list = [0, 5, 10, 15, 20, 25];
// This solution will need at most N iterations, where N is the length of list
function checkInRange(value, range, list) {
return list.some((el) => {
return (el >= (value - range)) && (el <= (value + range));
})
}
// This solution will need at most N iterations, where N is the length of a, e.g. 2 * range + 1
function checkInRangeSet(value, range, list) {
// Create an array of matching numbers, e.g. 8,9,10,11,12
let a = Array.from({ length: 2*range + 1 }, (v,k) => value - range + k);
let set = new Set(list);
return a.some((el) => {
return set.has(el);
})
}
console.log("Solution with simple loop");
console.log(checkInRange(11, 1, list));
console.log(checkInRange(10, 0, list));
console.log(checkInRange(30, 5, list));
console.log(checkInRange(9, 0, list));
console.log(checkInRange(100, 20, list));
console.log("Solution with Set");
console.log(checkInRangeSet(11, 1, list));
console.log(checkInRangeSet(10, 0, list));
console.log(checkInRangeSet(30, 5, list));
console.log(checkInRangeSet(9, 0, list));
console.log(checkInRangeSet(100, 20, list));