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