56

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

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

我的列表项看起来像这样(为了便于阅读,我已经减少了):

<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 向我展示了我的数组,该数组似乎已排序,因此我可以获取我假设的第一个和最后一个元素,但目前数组中的名称和值是相同的,所以每当我尝试执行价格 [0 ],我得到未定义

[]
19.38   19.38
20.00   20.00
29.97   29.97
31.00   31.00

感觉这是一个愚蠢的简单问题,所以请善待:)

4

8 回答 8

169

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

var _array = [1,3,2];
Math.max.apply(Math,_array); // 3
Math.min.apply(Math,_array); // 1
于 2012-08-16T10:58:21.407 回答
12

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

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.maxmin

编辑:

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

prices.sort(function(a, b) { return a - b });
于 2012-08-16T10:36:13.550 回答
11

而不是 .each,另一种(可能更简洁)获取所有这些价格的方法可能是:

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

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

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

然后使用上面谢尔盖的解决方案:

var max = Math.max.apply(Math,prices);
var min = Math.min.apply(Math,prices);
于 2014-08-21T08:26:02.020 回答
3
arr = [9,4,2,93,6,2,4,61,1];
ArrMax = Math.max.apply(Math, arr);
于 2014-11-24T16:31:07.390 回答
3

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

var max_value = Math.max(val1, val2, val3, val4, val5);
于 2013-12-10T10:37:20.973 回答
1

使用lodash查找数组中的最大和最小数字。

var array = [1, 3, 2];
var func = _.over(Math.max, Math.min);
var [max, min] = func(...array);
// => [3, 1]
console.log(max);
console.log(min);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

于 2019-01-03T09:16:06.320 回答
1

使用它,它适用于静态数组和动态生成的数组。

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

我在'NAN'使用时得到

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

用我的代码

于 2017-04-24T10:22:51.490 回答
0

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

要在 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.
于 2021-05-09T08:23:53.313 回答