在Javascript中从数组中获取最小值?

时间:2012-01-19 23:25:36

标签: javascript arrays min

Array justPrices具有以下值:

[0] = 1.5
[1] = 4.5
[2] = 9.9.

如何返回数组中的最小值?

17 个答案:

答案 0 :(得分:81)

Jon Resig在this article中说明了如何通过扩展Array原型并调用底层的Math.min方法来实现这一点,这种方法很遗憾不会采用数组而是采用可变数量的参数:

Array.min = function( array ){
    return Math.min.apply( Math, array );
};

然后:

var minimum = Array.min(array);

答案 1 :(得分:65)

找到最小值的最简洁的表达代码可能是rest parameters

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = Math.min(...arr)
console.log(min)


当您不需要更改函数的上下文时,Rest参数基本上是Function.prototype.apply的便捷简写:

var arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
var min = Math.min.apply(Math, arr)
console.log(min)


这也是Array.prototype.reduce的一个很好的用例:

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = arr.reduce((a, b) => Math.min(a, b))
console.log(min)

Math.min直接传递给reduce可能很诱人,但回调会收到其他参数:

callback (accumulator, currentValue, currentIndex, array)

在这种特殊情况下,它可能有点冗长。如果要将一组复杂数据聚合到一个值中,reduce特别有用:

const arr = [{name: 'Location 1', distance: 14}, {name: 'Location 2', distance: 58}, {name: 'Location 3', distance: 20}, {name: 'Location 4', distance: 77}, {name: 'Location 5', distance: 66}, {name: 'Location 6', distance: 82}, {name: 'Location 7', distance: 42}, {name: 'Location 8', distance: 67}, {name: 'Location 9', distance: 42}, {name: 'Location 10', distance: 4}]
const closest = arr.reduce(
  (acc, loc) =>
    acc.distance < loc.distance
      ? acc
      : loc
)
console.log(closest)


当然,你总是可以使用经典迭代:

var arr,
  i,
  l,
  min

arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
min = Number.POSITIVE_INFINITY
for (i = 0, l = arr.length; i < l; i++) {
  min = Math.min(min, arr[i])
}
console.log(min)

......但即使是经典的迭代也可以获得现代化的改造:

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
let min = Number.POSITIVE_INFINITY
for (const value of arr) {
  min = Math.min(min, value)
}
console.log(min)

答案 2 :(得分:35)

我发现返回数组最小值的最简单方法是在Math.min()函数上使用Spread Operator。

return Math.min(...justPrices);
//returns 1.5 on example given 

MDN上的页面有助于更好地理解它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min

多一点: 这也适用于Math.max()函数

返回Math.max(... justPrices); //在给定的示例中返回9.9。

希望这有帮助!

答案 3 :(得分:13)

更新:使用Darin / John Resig的回答,请记住,您不需要为min指定thisArg,因此Math.min.apply(null, arr)可以正常使用。


或者您可以排序数组并获取值#1: [2,6,7,4,1].sort()[0]

[!]但是,如果没有提供自定义数字排序功能,这只会在一个非常有限的情况下起作用:小于10的正数。看看它会如何破裂:

var a = ['', -0.1, -2, -Infinity, Infinity, 0, 0.01, 2, 2.0, 2.01, 11, 1, 1e-10, NaN];

// correct: 
a.sort( function (a,b) { return a === b ? 0 : a < b ? -1: 1} );
//Array [NaN, -Infinity, -2, -0.1, 0, "", 1e-10, 0.01, 1, 2, 2, 2.01, 11, Infinity]

// incorrect:
a.sort();
//Array ["", -0.1, -2, -Infinity, 0, 0.01, 1, 11, 1e-10, 2, 2, 2.01, Infinity, NaN]

而且,数组就地更改,这可能不是您想要的。

答案 4 :(得分:6)

想象一下你有这个数组:

var arr = [1, 2, 3];

ES6方式:

var min = Math.min(...arr); //min=1

ES5方式:

var min = Math.min.apply(null, arr); //min=1

如果您使用D3.js,有一个方便的功能,但会忽略未定义的值并检查自然顺序:

  

d3.max(array [,accessor])

     

使用自然顺序返回给定数组中的最大值。如果   数组为空,返回undefined。可选的访问器功能   可以指定,这相当于调用array.map(accessor)   在计算最大值之前。

     

与内置的Math.max不同,此方法忽略未定义的值;   这对忽略丢失的数据很有用。此外,元素是   比较使用自然顺序而不是数字顺序。例如,   字符串[“20”,“3”]的最大值为“3”,而最大值为   数字[20,3]是20。

这是D3 v4的源代码:

export default function(values, valueof) {
  var n = values.length,
      i = -1,
      value,
      max;

  if (valueof == null) {
    while (++i < n) { // Find the first comparable value.
      if ((value = values[i]) != null && value >= value) {
        max = value;
        while (++i < n) { // Compare the remaining values.
          if ((value = values[i]) != null && value > max) {
            max = value;
          }
        }
      }
    }
  }

  else {
    while (++i < n) { // Find the first comparable value.
      if ((value = valueof(values[i], i, values)) != null && value >= value) {
        max = value;
        while (++i < n) { // Compare the remaining values.
          if ((value = valueof(values[i], i, values)) != null && value > max) {
            max = value;
          }
        }
      }
    }
  }

  return max;
}

答案 5 :(得分:5)

ES6是未来之路。

arr.reduce((a, b) => Math.min(a, b));

我更喜欢这种形式,因为它很容易推广到其他用例

答案 6 :(得分:2)

可能更简单?

假设justPrices在值方面混淆了,所以你不知道最小值在哪里。

justPrices[0] = 4.5
justPrices[1] = 9.9
justPrices[2] = 1.5

使用sort。

justPrices.sort();

然后它会把它们整理好。 (也可以按字母顺序完成。)然后数组将按升序排列。

justPrices[0] = 1.5
justPrices[1] = 4.5
justPrices[2] = 9.9

然后您可以轻松抓住第一个索引。

justPrices[0]

我发现这比上面提到的更有用,因为如果你需要最低的3个数字作为例子怎么办?您还可以在http://www.w3schools.com/jsref/jsref_sort.asp

切换他们安排的订单,更多信息

答案 7 :(得分:2)

var array =[2,3,1,9,8];
var minvalue = array[0]; 
for (var i = 0; i < array.length; i++) {
    if(array[i]<minvalue)
    {
        minvalue = array[i];
    }

}
  console.log(minvalue);

答案 8 :(得分:1)

function smallest(){
  if(arguments[0] instanceof Array)
    arguments = arguments[0];

  return Math.min.apply( Math, arguments );
}
function largest(){
  if(arguments[0] instanceof Array)
    arguments = arguments[0];

  return Math.max.apply( Math, arguments );
}
var min = smallest(10, 11, 12, 13);
var max = largest([10, 11, 12, 13]);

console.log("Smallest: "+ min +", Largest: "+ max);

答案 9 :(得分:1)

这是达林·迪米特洛夫(Darin Dimitrov)回答的一种变体,它没有修改Array原型:

const applyToArray = (func, array) => func.apply(Math, array)

applyToArray(Math.min, [1,2,3,4]) // 1
applyToArray(Math.max, [1,2,3,4]) // 4

答案 10 :(得分:1)

function tinyFriends() {
    let myFriends = ["Mukit", "Ali", "Umor", "sabbir"]
    let smallestFridend = myFriends[0];
    for (i = 0; i < myFriends.length; i++) {
        if (myFriends[i] < smallestFridend) {
            smallestFridend = myFriends[i];
        }
    }
    return smallestFridend   
}

答案 11 :(得分:0)

如果您使用的是Underscore或Lodash,您可以使用这种简单的功能管道获得最小值

_.chain([7, 6, -1, 3, 2]).sortBy().first().value()
// -1

您还拥有.min功能

_.min([7, 6, -1, 3, 2])
// -1

答案 12 :(得分:0)

我认为我只使用javaScript的基础知识,有一个易于理解的解决方案。

function myFunction() {
            var i = 0;
            var smallestNumber = justPrices[0];
            for(i = 0; i < justPrices.length; i++) {
                if(justPrices[i] < smallestNumber) {
                    smallestNumber = justPrices[i];
                }
            }
            return smallestNumber;
        }

变量smallestNumber设置为justPrices的第一个元素,for循环遍历数组(我只是假设您知道for循环是如何工作的;如果不是,请查看它)。如果数组的元素小于当前smallestNumber(最初是第一个元素),它将替换它的值。当整个数组经过循环时,smallestNumber将包含数组中最小的数字。

答案 13 :(得分:0)

这里的代码将检测数字数组中的最小值。

//function for finding smallest value in an array
function arrayMin(array){
    var min = array[0];
    for(var i = 0; i < array.length; i++){
        if(min < array[i]){
            min = min;
        }else if (min > array[i]){
            min = array[i + 1];
        }else if (min == array[i]){
            min = min;
        }
    }
    return min;
};

以这种方式调用:

var fooArray = [1,10,5,2];
var foo = arrayMin(fooArray);

(只需将第二个else if的结果从min = min更改为min = array[i]  如果您想将数值最小的数字替换为原始数字。)

答案 14 :(得分:0)

这是一种使用三元运算符进行递归并决定是否遇到最小数的递归方法。

const findMin = (arr, min, i) => arr.length === i ? min :
  findMin(arr, min = arr[i] < min ? arr[i] : min, ++i)

代码段:

const findMin = (arr, min, i) => arr.length === i ? min :
  findMin(arr, min = arr[i] < min ? arr[i] : min, ++i)
  
const arr = [5, 34, 2, 1, 6, 7, 9, 3];
const min = findMin(arr, arr[0], 0)
console.log(min);

答案 15 :(得分:0)

对于任何需要这个的人,我只是有一种感觉。 (获取数组中具有多个值的最小数字) 感谢 Akexis 的回答。

如果你有一个数组 分钟内的距离和 ID 和 ETA 所以你可能会推入 for 循环或其他东西

Distances.push([1.3, 1, 2]); // Array inside an array.

然后当它完成时,做一个排序

Distances.sort();

所以这将排序第一件事,即这里的距离。 现在我们有最接近或至少是你可以做的第一个

Distances[0] // The closest distance or the smallest number of distance. (array).

答案 16 :(得分:0)

找到最小值的一种超级简单的方法是

Array.prototype.min = function(){
    return Math.min.apply(Math,this);
};

要调用函数,只需使用数组的名称并添加 .min()

Array.prototype.min = function(){
    return Math.min.apply(Math,this);
};
var arr = [12,56,126,-1,5,15];
console.log(   arr.min()   );