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

在JavaScript中从数组中获取最大值和最小值,javascript,jquery,arrays,position,Javascript,Jquery,Arrays,Position,我正在从数据属性创建以下数组,我需要能够从中获取最高值和最低值,以便稍后将其传递给另一个函数 var allProducts = $(products).children("li"); prices = [] $(allProducts).each(function () { var price = parseFloat($(this).data('price')); prices[price] = price; }); console.log(prices[0]) <!-

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

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

我觉得这是一个愚蠢而简单的问题,所以请客气一点:)

为什么不将其存储为价格数组而不是对象

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()
分别获得最小和最大价格,但它将从数组中扣除价格

更好的选择是使用下面的Sergei解,分别使用
Math.max
min

编辑:

我意识到,如果您有类似于
[11.5,3.1,3.5,3.7]
的东西,这将是错误的,因为
11.5
被视为一个字符串,并且将以字典顺序出现在
3.x
之前,您需要传入自定义排序函数,以确保它们确实被视为浮点:

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

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

var _array = [1,3,2];
Math.max.apply(Math,_array); // 3
Math.min.apply(Math,_array); // 1
var max_value = Math.max(val1, val2, val3, val4, val5);
如果有“分散”(不在数组内)值,则可以使用:

var _array = [1,3,2];
Math.max.apply(Math,_array); // 3
Math.min.apply(Math,_array); // 1
var max_value = Math.max(val1, val2, val3, val4, val5);
取而代之的是,获取所有这些价格的另一种(也许更简洁)方法可能是:

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

另外,您可能需要考虑对数组进行过滤,以消除空或非数值数组值,以防它们存在:

prices = prices.filter(function(n){ return(!isNaN(parseFloat(n))) });
然后使用上述Sergey的解决方案:

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

使用此选项,它可以在静态数组和动态生成的数组上工作

var array = [12,2,23,324,23,123,4,23,132,23];
var getMaxValue = Math.max.apply(Math, array );
当我试图从下面的代码中找到最大值时,我遇到了这个问题

$('#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);

使用我的代码

查找数组中的最大数和最小数

var数组=[1,3,2];
var func=u.over(Math.max,Math.min);
var[max,min]=func(…数组);
// => [3, 1]
控制台日志(最大值);
控制台日志(分钟)

如果需要在不使用数学库或排序逻辑的情况下找到解决方案,以下解决方案可能会有所帮助

要在javascript中查找最大值

var max = -Infinity;
 for (var i = 0; i < arr.length; ++i) {
    if (arr[i] < max) continue;
    if (arr[i] > max) {
        max = arr[i];
 }
}
return max; 
var max=-无穷大;
对于(变量i=0;i最大值){
max=arr[i];
}
}
返回最大值;
要查找最小值

 var min = +Infinity;
 for (var i = 0; i < arr.length; ++i) {
    if (arr[i] > min) continue;
    if (arr[i] < min) {
        min = arr[i];
 }
}
return min;
var min=+无穷大;
对于(变量i=0;imin)继续;
如果(arr[i]
要查找所有出现的最大值,(更改比较以获取所有最小值)

var max=-Infinity,result=[];
对于(变量i=0;i最大值){
结果=[];
max=arr[i];
}
结果:推力(最大值);
}
返回结果;//return result.length返回最大值的出现次数。

这个
prices[price]
不应该是:
prices.push()
为了使用键[0]、[1]…?你可能有多少个价格?当然你必须在某处订购列表,以假设第一个最便宜,最后一个最贵?+1是明确的解决方案。起初,我在你的答案中找不到
sort()
。因此,在代码附近添加注释您的编辑毫无意义,您在添加到数组之前使用的是
parseFloat
,因此排序将自动使用数字排序而不是字符串。@Jamiec是否测试了您的注释。还是我错过了什么(我也采用了与您相同的方式,我几乎完全同意这一点,但我做了一个快速测试,对于长度超过10个值的数组,使用
Math.max.apply(Math,arr)
Math.min.apply(Math,arr)要快得多。)
分别对整个数组进行实际排序?任何大于此值的值和
max
min
的值都会大大提高。就我个人而言,我认为对发生的情况更清楚。我使用了
Math.max.apply(null,_array)
它工作得很好。有什么理由不这样做吗?@ButtleButkus您可以在当前情况下使用
null
而没有任何问题。Mozilla的伙计们也将它作为第一个参数使用:
Math.max.apply(null,number);
从ES6开始,您可以使用数组的扩展:
Math.max(…array)
你能解释一下答案吗?这是最优雅的解决方案,也是推荐的方法。“map()方法对于获取或设置元素集合的值特别有用。”对于现代javascript代码来说,这种方法非常优雅。
var max = -Infinity;
 for (var i = 0; i < arr.length; ++i) {
    if (arr[i] < max) continue;
    if (arr[i] > max) {
        max = arr[i];
 }
}
return max; 
 var min = +Infinity;
 for (var i = 0; i < arr.length; ++i) {
    if (arr[i] > min) continue;
    if (arr[i] < min) {
        min = arr[i];
 }
}
return min;
 var max = -Infinity, result = [];
  for (var i = 0; i < arr.length; ++i) {
   if (arr[i] < max) continue;
   if (arr[i] > max) {
      result = [];
      max = arr[i];
    }
   result.push(max);
  }
 return result; // return result.length to return the number of occurrences of max values.