在平局的情况下,我如何 return javascript 中较小的数字?

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

我需要编写一个接受两个输入的函数,'target'(整数)和 'values'(整数列表),并找出 'values' 中的哪个数字最接近'target'。我想出了以下内容:

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));

该函数有效,但我无法 return 在平局的情况下使用较小的值。我能想到的最好的是以下不起作用:

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;
}

在平局的情况下,我如何 return JavaScript 中较小的数字?

您的代码看起来可以工作尝试将 Math.min[currVal, values[i]] 更改为 Math.min(currVal, values[i]) 如果您的值是有序的(简单的语法问题)应该可以工作。

正如 kojow7 所提到的,只要 values 被排序,第一个函数也应该可以工作。

否则,您应该尝试执行 currVal = Math.min(...) 而不是 return Math.min(...) 并继续迭代,然后在循环后返回 currVal。这只是确保您检查 values 数组中的每个值以确保您没有遗漏任何内容(但如果已订购,则无需继续检查,因为差异只会增加)。

诀窍在于,当您找到新的最佳差异并记录差异 (bestDiff) 时,您还会记录导致该差异的值 (bestVal)。

所以现在,如果遇到平局(currDiff == bestDiff),你需要检查它是否是更好的平局,即检查当前值是否为小于记录的 (currVal < bestVal)。如果是,那么我们更新最佳值(同时更新 bestDiffbestVal)。

function closestToTarget(target, values) {
    var currVal = values[0];
    var bestDiff = Math.abs(target - currVal);
    var bestVal = currVal;

    for (var i = 1; i < values.length; i++) {
        var currVal = values[i];
        var currDiff = Math.abs(target - values[i]);
        if (currDiff < bestDiff || (currDiff == bestDiff && currVal < bestVal)) {
            bestDiff = currDiff;
            bestVal = currVal;
        }
    }
    return bestVal;
}

示例:

closestToTarget(2,[2,4,6,8,10]) // 2
closestToTarget(2,[10,8,6,4,2]) // 2
closestToTarget(3,[10,8,6,4,2]) // 2

你的想法应该可行,但你也可以使用你的第一个函数,但在最后添加一些检查较低领带的东西:

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/

除了语法错误(缺少括号)之外,您可以使用一些 ES6 语法来编写更简洁的函数:

function closestToTarget(target, values) {
    const m = Math.min(...values.map( v => Math.abs(target - v)));
    return Math.min(...values.filter( v => Math.abs(target - v) === m ));
}

var valuesArr = [2, 4, 6, 8, 10];
// Try several numbers
for (var i = 1; i < 12; i++) {
    console.log(i, closestToTarget(i, valuesArr));
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

function findClosest(inpt, ar) {
   var minDiff = Math.abs(ar[0] - inpt);
   var res = ar[0];
   for (var i = 1; i < ar.length; i++) {
       if(Math.abs((ar[i] - inpt)) < minDiff)
           res = ar[i];
   }
   return res;
}

这是一个关于如何为给定输入获取数组中最接近值的简单示例。 如果出现平局,则 return 不会有更低的数字。如果您在数组中有多个最接近的整数,则对于所有平局情况,您的输入之间的差异是相同的。所以不用担心。