Показать сообщение отдельно
  #5 (permalink)  
Старый 18.02.2020, 00:04
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

ежели массив отсортированный, и при этом большой, то лучше бинарный поиск

function binSearch(arr, x) {
    if (!arr || !arr.length || arr[arr.length - 1] < x) return arr ? arr.length : 0;
    var b = 0, e = arr.length;
    while (e > b) {
        var idx = Math.floor((b + e) / 2);
        if (arr[idx] < x) b = idx + 1;
        else e = idx;
    }
    return e;
}

function round(n, nums) {
    var pos = binSearch(nums, n);
    if (pos === nums.length) return nums[nums.length - 1];
    if (pos === 0) return nums[0];
    return n - nums[pos - 1] < nums[pos] - n ? nums[pos - 1] : nums[pos];
}

// -----------------
var arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35];

alert([-7, 6, 11, 28, 60].map(v => v + ' -> ' + round(v, arrayNumbers)).join('\n'))
Ответить с цитированием