【问题标题】:Get max and min value from array in JavaScript在 JavaScript 中从数组中获取最大值和最小值
【发布时间】:2012-08-16 10:34:41
【问题描述】:

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

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],我得到 undefined

[]
19.38   19.38
20.00   20.00
29.97   29.97
31.00   31.00

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

【问题讨论】:

  • 不应该是 prices[price]prices.push() 以便使用键 [0],[1]...?
  • 你可能有多少个价格?

标签: javascript jquery arrays position


【解决方案1】:

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

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

【讨论】:

  • 我使用了Math.max.apply(null,_array),效果很好。有什么理由不这样做?
  • @ButtleButkus 对于当前情况,您可以使用null 没有任何问题。 Mozilla 的人也将它用作 their examples at MDN: Math.max.apply(null, numbers); 中的第一个参数
  • 从 ES6 开始,您可以使用数组扩展:Math.max(...array);
【解决方案2】:

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

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] 的内容,这将是错误的,因为 11.5 被视为字符串,并且会按字典顺序 3.x 之前出现,您需要传入自定义排序函数以确保它们确实被视为浮点数:

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

【讨论】:

  • 您肯定必须在某处订购列表以假定第一个最便宜,最后一个最贵?
  • +1 以获得清晰的解决方案。起初我在你的回答中找不到sort()。所以在代码附近发表评论
  • 你的编辑没有意义,你在添加到数组之前使用parseFloat,所以排序会自动使用数字排序而不是字符串。
  • @Jamiec 你测试你的评论了吗? jsfiddle.net/9H2xg/1。还是我在这里错过了什么? :( 我也假设和你一样
  • 我几乎完全同意这一点,但我做了一个快速的jsperf 测试,对于长度超过10 个值的数组,使用Math.max.apply(Math, arr)Math.min.apply(Math, arr) 会更快一些分别比实际排序整个数组?任何比这更大的,maxmin 都将遥遥领先。我个人认为正在发生的事情更清楚。
【解决方案3】:

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

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

【讨论】:

  • 最优雅的解决方案,恕我直言
  • 推荐的方式。 “.map() 方法对于获取或设置元素集合的值特别有用。” api.jquery.com/map
【解决方案4】:

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

var max_value = Math.max(val1, val2, val3, val4, val5);

【讨论】:

    【解决方案5】:
    arr = [9,4,2,93,6,2,4,61,1];
    ArrMax = Math.max.apply(Math, arr);
    

    【讨论】:

    • 你能解释一下答案吗?
    【解决方案6】:

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

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

    用我的代码

    【讨论】:

      【解决方案7】:

      使用 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);
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"&gt;&lt;/script&gt;

      【讨论】:

      • 对于现代 javascript 代码,这种方法非常优雅。
      【解决方案8】:

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

      要在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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 2011-08-16
        相关资源
        最近更新 更多