如何使用javascript查找数组中的最小十进制值

时间:2014-10-03 05:27:08

标签: javascript arrays

我有十进制数组,例如

  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

6 个答案:

答案 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遍历数组并为数组中的每个项调用一次提供的函数。
  • 此代码仅使用函数中可用的前两个参数,但有几个others available too。第一个参数是从上一次调用返回的值(prev,在第一次调用时将为undefined。第二个参数将是数组中当前项的值(cur)。
  • 在比较两者之前,他们每个人都使用Unary plus operator从字符串强制转换为数字。
  • 如果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);