簡體   English   中英

如何使用javascript查找數組中的最小十進制值

[英]How to find minimum decimal value in array using javascript

我有十進制數的數組,如

  var idArray = ["98.40", "111.46", "144.47", "180.48", "217.49", "284.50", "424.51", "571.52", "1887.53", "1960.54", "1972.55", "2118.56", "2167.57", "2467.58", "2480.59", "2488.60", "2662.61", "2671.62", "2767.63", "2982.64", "3168.65", "3263.66", "3295.67", "3369.68", "3579.69", "3592.70", "3600.71", "3605.72", "3620.73", "3646.74", "3852.75", "3857.76", "4031.77", "4489.78", "4975.79"]

我在數組中找到了最小值,如下所示

var result = Math.min.apply(null,idArray);

我的結果為98.4

有沒有辦法將數組中的實際值返回為98.40

如果它確實是一個數組,你可以用舊方式代替迭代,並返回實際的字符串而不是解析的數字,這樣小數位數就不重要了。

 var idArray = ["98.40", "111.46", "144.47", "180.48", "217.49", "284.50", "424.51", "571.52", "1887.53", "1960.54", "1972.55", "2118.56", "2167.57", "2467.58", "2480.59", "2488.60", "2662.61", "2671.62", "2767.63", "2982.64", "3168.65", "3263.66", "3295.67", "3369.68", "3579.69", "3592.70", "3600.71", "3605.72", "3620.73", "3646.74", "3852.75", "3857.76", "4031.77", "4489.78", "4975.79"]; var result = idArray[0]; idArray.forEach(function(x) { if (parseFloat(x) < result) result = x; // find smallest number as string instead }); document.body.innerHTML = result; 

或者,您可以只對數組進行排序並獲取第一個項目(我將其切成不修改原始項目)

var result = idArray.slice().sort(function(a,b) {
    return a - b;
}).shift();

或者,使用Array.reduce

var result = idArray.reduce(function (a,b) {
    return parseFloat(a) < parseFloat(b) ? a : b;
});

你可以編寫自己的代碼:

minInArr = function(arr) {
    var smallest = arr[0];

    for(var i=1; i<arr.length; i++){
        if(parseInt(arr[i],10) < smallest){
            smallest = arr[i];   
        }
    }

    return smallest
}

基於此代碼制作此代碼: 返回數組中最大值的索引

除了那些已經存在的方法之外還有幾種方法(盡管一種方法與adeneo非常相似)。 一種是復制數組,對其進行排序,然后獲取0索引值:

var min = idArray.slice().sort(function(a,b){return a - b})[0];

如果您不關心對原始數組進行排序,請刪除.slice()部分。

另一種方法是使用Math.min獲取值,然后使用一些在原始數組中找到它。 一些人的好處是它將在第一場比賽時停止:

var min, temp = Math.min.apply(Math, idArray);

idArray.some(function(v){ return temp == v? min = v : false});

console.log(min);

每個人都有利弊,選擇最容易維護的東西。

嘗試:

var roundedResult = parseFloat(result).toFixed(2);

尾隨零沒有重要性,因此它被截斷。 所以除了將其存儲為字符串之外,別無其他。

var result = Math.min.apply(null, idArray);
result = (result+"").test(/\.\d\d$/) ? result : result + "0"

應用Math.min將始終強制您對數字的回答,如果您將其強制回字符串,則會丟失任何尾隨零。 正如其他人所建議的那樣,如果你知道你在小數點后總是有一個固定的位數,你可以使用.toFixed

不依賴於具有固定數量的小數點的更好的解決方案是使用.reduce

var result,
  idArray = ["98.40", "111.46", "144.47", "180.48", "217.49", "284.50", "424.51", "571.52", "1887.53", "1960.54", "1972.55", "2118.56", "2167.57", "2467.58", "2480.59", "2488.60", "2662.61", "2671.62", "2767.63", "2982.64", "3168.65", "3263.66", "3295.67", "3369.68", "3579.69", "3592.70", "3600.71", "3605.72", "3620.73", "3646.74", "3852.75", "3857.76", "4031.77", "4489.78", "4975.79"];

result = idArray.reduce(function (prev, cur) {
  if (+prev < +cur) {
    return prev;
  } else {
    return cur;
  }
 });

console.log(result); // "98.40"

快速解釋這是做什么的:

  • .reduce遍歷數組並為數組中的每個項調用提供的函數一次。
  • 此代碼僅使用函數中可用的前兩個參數,但也有其他幾個可用 第一個參數是從前一個調用返回的值( prev ,在第一次調用時將是undefined的)。 第二個參數是數組中當前項的值( cur )。
  • 在比較兩者之前,使用Unary plus運算符將它們從字符串強制轉換為數字。
  • 如果prev較小則返回,並且下次函數運行prev將相同,否則返回cur並在下一次調用時成為prev的新值。 重要的是要注意,當變量被強制比較它們只是改變條件語句中比較的值時,它沒有改變存儲在變量中的實際值,它仍然是一個字符串。
  • 在對數組中的最后一項調用函數之后,返回prev的最終值並將其存儲在result

您可以使用三元語句將其縮短一點:

result = idArray.reduce(function (prev, cur) {
  return +prev < +cur ? prev : cur;
 });

如果您不害怕使用ES6語法(並非所有瀏覽器目前都支持它),您可以使用箭頭功能縮短它:

result = idArray.reduce((prev, cur) => +prev < +cur ? prev : cur);

這種方法的一個潛在(但不太可能)的問題是它每次進行比較時都會強制使用prev 這為循環中的每個步驟增加了一點點開銷。 如果性能是一個問題,那么最好不要嘗試使用單行程序並編寫一個函數來執行此操作:

var arrayMin = function  (arr) {
  var i,
    len,
    prev, // prev and cur will hold numbers that are coerced from strings
    cur,  // once when they are first encountered
    minIndex; // keep track of the index of the smallest item rather
              // than copying a string every time we find a smaller number

  prev = +arr[0];
  minIndex = 0;
  for (i = 1, len = arr.length; i < len; i += 1) {
    cur = +arr[i];
    if (cur < prev) {
      prev = cur;
      minIndex = i;
    }
  }

  return arr[minIndex];
};

var result = arrayMin(idArray);

暫無
暫無

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

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