2012-08-16 165 views
42

我從數據屬性創建以下數組,我需要能夠從中獲取最高和最低值,以便稍後將其傳遞給另一個函數。從JavaScript數組中獲取最大值和最小值

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 

有一種感覺,這是一個愚蠢的簡單問題,所以請親切:)

+0

不應該的問題'price [price]'是這個:'prices.push()'爲了使用鍵[0],[1] ...? – 2012-08-16 10:36:13

+0

你可能有多少價格? – phenomnomnominal 2012-08-16 10:52:45

回答

141

要獲得分/數組最大值,您可以使用:

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

我用'Math.max.apply(null,_array)',它工作正常。任何理由不這樣做? – 2014-09-24 23:17:18

+0

@ButtleButkus你可以在當前情況下使用'null'而沒有任何問題。 Mozilla傢伙也將它作爲MDN中的第一個參數(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#Using_apply_and_built-in_functions) : 'Math.max.apply(null,numbers);' – 2014-09-25 22:20:11

+0

從ES6開始,您可以使用數組的擴散: '''Math.max(... array);''' – krmld 2017-09-04 11:06:29

11

爲什麼不把它作爲一個價格數組而不是對象存儲?

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()分別獲得最小和最大的價格,但它會起飛從陣列的價格。

更好的選擇是使用下面的謝爾蓋解決方案,分別使用Math.maxmin

編輯:

我意識到,這將是錯誤的,如果你有類似[11.5, 3.1, 3.5, 3.7]11.5被視爲一個字符串,並且會來在字典順序3.x之前,你需要傳遞的自定義排序功能,以確保他們確實視爲浮動:

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

當然,你必須在某個地方訂購清單,以假定第一個是最便宜的,最後一個是最昂貴的? – Jamiec 2012-08-16 10:37:17

+1

+1表示清晰的解決方案。起初我在你的答案中找不到'sort()'。所以在代碼附近發表評論 – diEcho 2012-08-16 10:41:29

+0

您的編輯沒有任何意義,您在添加到數組之前使用'parseFloat',因此排序會自動使用數字排序而不是字符串。 – Jamiec 2012-08-16 10:44:36

3

如果你有「散」(不是數組裏面)值可以使用:

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

相反。每次的,其它的(也許更簡潔)的方式來獲得所有這些價格可能是:

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

最優雅的解決方案,imho – borodatych 2015-07-28 08:17:32

+0

推薦的方法。 「.map()方法對獲取或設置元素集合的值特別有用。」 https://api.jquery.com/map/ – lowtechsun 2016-02-15 01:10:53

1
arr = [9,4,2,93,6,2,4,61,1]; 
ArrMax = Math.max.apply(Math, arr); 
+0

你能解釋一下答案嗎? – fedorqui 2014-11-24 16:51:02

0

使用這個和它的工作原理上的靜態陣列和動態生成的陣列兩者。

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

我的代碼

相關問題