blue-success blue-success - 2 months ago 11
Javascript Question

In the case of a tie, how do I return the smaller number in javascript?

I need to write a function that takes two inputs, 'target' (integer) and 'values' (a list of integers), and find which number in 'values' is closest to 'target'. I came up with the following:

var targetNum = 0;
var valuesArr = [2, 4, 6, 8, 10];

function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
}
return currVal;
}
alert(closestToTarget(targetNum, valuesArr));


The function works, but I'm unable to return the smaller value in the case of a tie. The best that I could think of was the following which did not work:

function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
else if (currDiff == diff) {
return Math.min[currVal, values[i]];
}
else {
return currVal[i - 1];
}
}
return currVal;
}


In the case of a tie, how do I return the smaller number in JavaScript?

Answer

Your idea should work, but you could also use your first function but with the addition of something that checks for a lower tie at the end:

function closestToTarget(target, values) {
    var currVal = values[0];
    var diff = Math.abs(target - currVal);
    for (var i = 0; i < values.length; i++) {
        var currDiff = Math.abs(target - values[i]);
        if (currDiff < diff) {
            diff = currDiff;
            currVal = values[i];
        }
    }

    // We found the closest but now check if there's a smaller tie
    if (currVal > target && values.indexOf(target - diff) > -1 ) {
        return target - diff;
    }
    else {
    // if not just return what we originally found
        return currVal;
    }
}

https://jsfiddle.net/vsj0q5u9/2/