2012-08-16 36 views
42

Tworzę następującą tablicę z atrybutów danych i muszę mieć możliwość pobrania z niej najwyższej i najniższej wartości, aby móc później przekazać ją innej funkcji.Uzyskaj maksymalną i minimalną wartość z tablicy w 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 

Moja lista przedmiotów wyglądać tak (mam wyciąć dla czytelności):

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

Szybkie console.log na cenach pokazuje mi moja tablica, która wydaje się być sortowane, więc mogłem chwycić pierwszy i ostatni element Zakładam, ale obecnie nazwy i wartości w tablicy są takie same, więc gdy próbuję zrobić i ceny [0], mam niezdefiniowanej

[] 
19.38 19.38 
20.00 20.00 
29.97 29.97 
31.00 31.00 

Mam wrażenie, że to jest głupie łatwe pytanie, więc proszę bądź miły :)

+0

shouldn 't this 'prices [price]' be this: 'prices.push()' aby użyć klawiszy [0], [1] ...? –

+0

Ile cen prawdopodobnie masz? – phenomnomnominal

Odpowiedz

141

dostać min/max wartość w tablicy, można użyć:

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

Użyłem 'Math.max.apply (null, _array)' i to działało dobrze. Jakiś powód, żeby tego nie robić? –

+0

@ButtleButkus można użyć 'null' bez problemu dla bieżącego przypadku. Użytkownicy z Mozilli również używają go jako pierwszego parametru w [swoich przykładach na MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#Using_apply_and_built-in_functions) : 'Math.max.apply (zero, liczby);' –

+0

Z ES6 można użyć rozkładania tablicy: '' 'Math.max (... array);' '' – krmld

11

Dlaczego nie przechowywać go jako tablicy cen zamiast przedmiotu?

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 

ten sposób można po prostu

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

pamiętać, że można zrobić shift() i pop() aby uzyskać minimalną i maksymalną cenę odpowiednio, ale będzie to zdjąć cenę z tablicy.

Jeszcze lepszą alternatywą jest użycie rozwiązania Sergei poniżej, odpowiednio za pomocą Math.max i min.

EDIT:

zdałem sobie sprawę, że to będzie źle, jeśli masz coś takiego [11.5, 3.1, 3.5, 3.7] jak 11.5 jest traktowany jako ciąg znaków, a przyjdzie przed3.x w słowniku porządku, trzeba przejść w zwyczaju sortowania funkcja aby upewnić się, że rzeczywiście są traktowane jako float:

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

z pewnością musisz zamówić listę gdzieś, aby założyć, że pierwsza jest najtańsza, a ostatnia jest najdroższa? – Jamiec

+1

+1 dla przejrzystego rozwiązania. na początku nie mogłem znaleźć "sort()" w twojej odpowiedzi. więc komentarz w pobliżu kodu – diEcho

+0

Twoja edycja nie ma sensu, przed dodaniem do tablicy używasz 'parseFloat', więc sortowanie automatycznie użyje sortowania liczbowego zamiast łańcucha. – Jamiec

3

jeśli „rozproszone” (nie wewnątrz tablicy) wartości można użyć:

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

Zamiast .each, inny (być może bardziej zwięzły) podejście do uzyskania wszystkich tych cen może być:

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

dodatkowo może warto rozważyć filtrowania tablicę, aby pozbyć się pustych lub non-numeryczne wartości tablicowych w przypadku powinny one istnieć:

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

następnie wykorzystać rozwiązanie Sergeya powyżej:

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

Najbardziej eleganckie rozwiązanie, imho – borodatych

+0

Zalecany sposób. "Metoda .map() jest szczególnie przydatna do pobierania lub ustawiania wartości kolekcji elementów." https://api.jquery.com/map/ – lowtechsun

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

możesz wyjaśnić odpowiedź? – fedorqui

0

stosowania tego i działa zarówno na statycznych tablic i dynamicznie generowanych tablic.

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

miałem problem, gdy używam próbuje znaleźć wartość maksymalną z kodu poniżej

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

byłem coraz 'NAN' kiedy używam

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

z mojego kodu

Powiązane problemy