在JavaScript中获取数组中的最大值和最小值

我从数据属性创build以下数组,我需要能够从中获取最高和最低的值,以便稍后将其传递给另一个函数。

var allProducts = $(products).children("li"); prices = [] $(allProducts).each(function () { var price = parseFloat($(this).data('price')); prices[price] = price; }); console.log(prices[0]) <!-- this returns undefined 

我的列表项目看起来像这样(为了可读性,我已经减less了):

 <li data-price="29.97"><a href="#">Product</a></li> <li data-price="31.00"><a href="#">Product</a></li> <li data-price="19.38"><a href="#">Product</a></li> <li data-price="20.00"><a href="#">Product</a></li> 

一个快速的console.log价格显示我的数组似乎是sorting,所以我可以抓住第一个和最后一个元素,我认为,但目前的名称和数组中的值是相同的,所以每当我尝试做一个价格[0 ],我弄明白

 [] 19.38 19.38 20.00 20.00 29.97 29.97 31.00 31.00 

有一种感觉,这是一个愚蠢的简单的问题,所以请亲切:)

要获得数组中的最小/最大值,可以使用:

 var _array = [1,3,2]; Math.max.apply(Math,_array); // 3 Math.min.apply(Math,_array); // 1 

为什么不把它作为价格而不是对象来存储呢?

 prices = [] $(allProducts).each(function () { var price = parseFloat($(this).data('price')); prices.push(price); }); prices.sort(function(a, b) { return a - b }); //this is the magic line which sort the array 

这样你可以

 prices[0]; // cheapest prices[prices.length - 1]; // most expensive 

请注意,您可以使用shift()pop()来分别获取最小和最大价格,但它会从数组中取消价格。

更好的select是使用下面的Sergei解决scheme,分别使用Math.maxmin

编辑:

我意识到如果你有像[11.5, 3.1, 3.5, 3.7]11.5被视为一个string,并且会按字典顺序出现 3.x 之前 ,那么你需要将自定义sorting函数传递给确保他们确实被视为浮动:

 prices.sort(function(a, b) { return a - b }); 

取而代之的是,获得所有这些价格的另一个(也许更简洁)的方法可能是:

 var prices = $(products).children("li").map(function() { return $(this).prop("data-price"); }).get(); 

此外,您可能需要考虑过滤数组以排除空值或非数值数组值,以防它们存在:

 prices = prices.filter(function(n){ return(!isNaN(parseFloat(n))) }); 

然后使用上面的Sergey的解决scheme:

 var max = Math.max.apply(Math,prices); var min = Math.min.apply(Math,prices); 

如果您有“分散”(不在数组中)值,您可以使用:

 var max_value = Math.max(val1, val2, val3, val4, val5); 
 arr = [9,4,2,93,6,2,4,61,1]; ArrMax = Math.max.apply(Math, arr); 

使用它,它可以在静态数组和dynamic生成的数组上工作。

 var array = [12,2,23,324,23,123,4,23,132,23]; var getMaxValue = Math.max.apply(Math, array ); 

当我试图从下面的代码中find最大值时,我遇到了这个问题

 $('#myTabs').find('li.active').prevAll().andSelf().each(function () { newGetWidthOfEachTab.push(parseInt($(this).outerWidth())); }); for (var i = 0; i < newGetWidthOfEachTab.length; i++) { newWidthOfEachTabTotal += newGetWidthOfEachTab[i]; newGetWidthOfEachTabArr.push(parseInt(newWidthOfEachTabTotal)); } getMaxValue = Math.max.apply(Math, array); 

当我使用时,我正在获得'NAN'

  var max_value = Math.max(12, 21, 23, 2323, 23); 

用我的代码