[英]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
)。 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.