我有十进制数组,例如
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
答案 0 :(得分:1)
如果它确实是一个数组,你可以用旧方式代替迭代,然后返回实际的字符串而不是解析的数字,这样小数点就不重要了。
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;
});
答案 1 :(得分:1)
您可以编写自己的代码:
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
}
基于此代码制作此代码: Return index of greatest value in an array
答案 2 :(得分:1)
除了那些已经存在的方法之外,还有一些方法(尽管有一种方法与adeneo非常相似)。一种是复制数组,对其进行排序,然后获得0
索引值:
var min = idArray.slice().sort(function(a,b){return a - b})[0];
如果您不关心对原始数组进行排序,请删除 .slice()部分。
另一种方法是使用 Math.min 来获取值,然后使用 some 在原始数组中找到它。 some 的好处是它会在第一场比赛时停止:
var min, temp = Math.min.apply(Math, idArray);
idArray.some(function(v){ return temp == v? min = v : false});
console.log(min);
每个人都有利弊,选择最容易维护的东西。
答案 3 :(得分:0)
尝试:
var roundedResult = parseFloat(result).toFixed(2);
答案 4 :(得分:0)
尾随零没有重要性因此被截断。所以除了将其存储为字符串之外别无其他。
var result = Math.min.apply(null, idArray);
result = (result+"").test(/\.\d\d$/) ? result : result + "0"
答案 5 :(得分: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
中。您可以使用ternary statement:
缩短一点result = idArray.reduce(function (prev, cur) {
return +prev < +cur ? prev : cur;
});
如果您不担心使用ES6语法(并非所有browsers currently support语法),您可以使用arrow function缩短语法:
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);