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

数组justPrices的值如下:

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

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

Jon Resig在本文中举例说明了如何通过扩展数组原型并调用底层的Math.min方法来实现这个function, 这个方法不幸的是没有使用数组,而是使用了可变数量的参数:

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

接着:

 var minimum = Array.min(array); 

这是Array.prototype.reduce的完美用例:

 min = arr.reduce(function(a, b, i, arr) {return Math.min(a,b)}); 

在MDN上可以findpolyfill


或者你可以使用apply

 min = Math.min.apply(Math, arr) 

或者你可以迭代:

 var i, l, min; min = Number.MAX_VALUE; for (i = 0, l = arr.length; i < l; i++) { min = Math.min(min, arr[i]); } 

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

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

更新:使用Darin的/ John Resig的答案,只要记住,你不需要指定thisArg min ,所以Math.min.apply(null, arr)将工作得很好。


或者你可以sorting数组,并获得值#1: [2,6,7,4,1].sort()[0]

[!]但是没有提供自定义的数字sortingfunction,这只会在一个非常有限的情况下工作: 正数小于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] 

而且, 数组也在原地改变 ,这可能不是你想要的。

想象一下你有这个数组:

 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)。

与内build的Math.max不同,此方法忽略未定义的值; 这对忽略丢失的数据很有用。 另外,使用自然顺序而不是数字顺序比较元素。 例如,string[“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; } 

ES6是未来的方式。

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

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

可能更简单的方法?

让我们说justPrices在价值方面是混合的,所以你不知道最小的价值在哪里。

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

使用sorting。

 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

 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); 

如果使用Underscore或Lodash,则可以使用这种简单的functionpipe道获得最小值

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

你也有.min函数

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

我想我有一个易于理解的解决scheme,只使用基本的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; } 

variablessmallestNumber被设置为justPrices的第一个元素,for循环循环遍历数组(我只是假设你知道for循环是如何工作的;如果不是的话,查找它)。 如果数组的一个元素小于当前的smallestNumber (它首先是第一个元素),它将取代它的值。 当整个数组经过循环时, smallestNumber将包含数组中的最小数字。

 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);