簡體   English   中英

如果是平局,如何在javascript中返回較小的數字?

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

我需要編寫一個接受兩個輸入的函數,即“目標”(整數)和“值”(整數列表),並找出“值”中的哪個數字最接近“目標”。 我想出了以下幾點:

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

該函數有效,但是如果出現平局,我將無法返回較小的值。 我能想到的最好的是以下無效的方法:

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

如果是平局,如何在JavaScript中返回較小的數字?

您的代碼看起來像嘗試將Math.min[currVal, values[i]]更改為Math.min(currVal, values[i])可以正常工作,如果您的值是有序的(簡單的語法問題)。

正如kojow7所提到的,只要對values進行排序,第一個函數也應該起作用。

否則,您應該嘗試執行currVal = Math.min(...)並保持迭代,然后在循環后返回currVal ,而不是return Math.min(...) 這只是確保您檢查values數組中的每個值以確保您沒有遺漏任何東西(但是如果已訂購,則無需繼續檢查,因為差異只會增加)。

除了語法錯誤(缺少括號)之外,您還可以使用一些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; } 

訣竅在於,當您發現新的最佳差異並記錄差異( 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/

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

這是有關如何獲取給定輸入的數組中最接近的值的簡單示例。 如果打成平局,將沒有較小的數字返回。 如果數組中有多個最接近的整數,則在所有平局情況下,輸入之間的差異相同。 所以不用擔心

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM