I have an array of numbers, for example [300, 500, 700, 1000, 2000, 3000] and I want to find the closest number, without going under the number given.
For instance, searching for 2200 would return 3000 (NOT 2000).
However, if I search for 3200 as there is nothing higher in the array, it should return 3000 as there are no other choices.
I can get the closest number that is under the value using:
if (sizeToUse == null || Math.abs(this - monitorWidth) < Math.abs(sizeToUse - monitorWidth)) {
                sizeToUse = this;
            }
However, I can't get the whole thing to work. My full code is:
$(function() {
var monitorWidth = window.screen.availWidth,
    sizeToUse = null,
    upscaleImages = false;
$('.responsive-img').each(function(){
    var sizeData = $(this).attr('data-available-sizes');
    sizeData = sizeData.replace(' ', '');
    var sizesAvailable = sizeData.split(',');
    sizesAvailable.sort(function(a, b){return b-a});
    $.each(sizesAvailable, function(){
        if(upscaleImages){
            if (sizeToUse == null || Math.abs(this - monitorWidth) < Math.abs(sizeToUse - monitorWidth)) {
                sizeToUse = this;
            }
        }
        else{
            //We don't want to upscale images so we need to find the next highest image available
        }
    });
    console.log('Size to use ' + sizeToUse + ' monitor width ' + monitorWidth);
});
});
                You can use this code :
function closest(arr, closestTo){
    var closest = Math.max.apply(null, arr); //Get the highest number in arr in case it match nothing.
    for(var i = 0; i < arr.length; i++){ //Loop the array
        if(arr[i] >= closestTo && arr[i] < closest) closest = arr[i]; //Check if it's higher than your number, but lower than your closest value
    }
    return closest; // return the value
}
var x = closest(yourArr, 2200);
Fiddle : http://jsfiddle.net/ngZ32/
var list = [300, 500, 700, 1000, 2000, 3000];
function findBestMatch(toMatch) {
    // Assumes the array is sorted.
    var bestMatch = null;
    var max = Number.MIN_VALUE;
    var item;
    for (var i = 0; i < list.length; i++) {
        item = list[i];
        if (item > toMatch) {
            bestMatch = item;
            break;
        }
        max = Math.max(max, item);
    }
    //  Compare to null, just in case bestMatch is 0 itself.
    if (bestMatch !== null) {
        return bestMatch;
    }
    return max;
}
alert(findBestMatch(2200));
alert(findBestMatch(3200));
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With