2012-08-16 8 views
42

Ich erstelle das folgende Array von Datenattributen und ich muss in der Lage sein, den höchsten und niedrigsten Wert von ihm zu greifen, damit ich es zu einer anderen Funktion später weitergeben kann.Maximaler und minimaler Wert von Array in 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 

Meine Liste Artikel wie folgt aussehen (ich habe für die Lesbarkeit abgeholzt):

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

Eine schnelle console.log auf die Preise zeigt mir meine Array, das so sortiert werden, erscheint die ich greifen konnte ich erste und die letzte Element übernehmen, aber derzeit die Namen und Werte im Array sind die gleiche, so, wenn ich versuche und ein Preis [0], ich undefined

[] 
19.38 19.38 
20.00 20.00 
29.97 29.97 
31.00 31.00 

Ich habe das Gefühl, dass dies eine blödsinnige einfache Frage ist, also sei bitte nett :)

+0

Shouldn verwenden, um zu finden, benutzen versuchen, 't this' Preise [Preis] 'sei dies:' prices.push() 'um die Schlüssel [0], [1] ... zu benutzen? –

+0

Wie viele Preise haben Sie wahrscheinlich? – phenomnomnominal

Antwort

141

min/max-Wert im Array zu erhalten, können Sie verwenden:

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

Ich benutzte 'Math.max.apply (null, _array)' und es hat gut funktioniert. Irgendein Grund, es nicht so zu machen? –

+0

@ButtleButkus können Sie 'Null' ohne Probleme für den aktuellen Fall verwenden. Mozilla-Leute verwenden es auch als ersten Parameter in [ihre Beispiele bei 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, Zahlen);' –

+0

Von ES6 können Sie die Verbreitung von Array verwenden: '' Math.max (... Array); '' – krmld

11

Warum nicht als Preis-Array statt als Objekt speichern?

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 

diese Weise können Sie nur

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

Beachten Sie, dass shift() und pop() min und max Preis tun können jeweils zu bekommen, aber es wird der Preis aus dem Array entfernen.

Noch bessere Alternative ist die Verwendung von Sergei-Lösung unter Verwendung von Math.max bzw. min.

EDIT:

wurde mir klar, dass dies falsch wäre, wenn Sie so etwas wie [11.5, 3.1, 3.5, 3.7] haben als 11.5 als String behandelt wird, und kommen würde vor die 3.x im Wörterbuch um, müssen Sie benutzerdefinierte passieren in Art Funktion, um sicherzustellen, sie sind in der Tat als float behandelt:

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

sicherlich müssen Sie die Liste irgendwo bestellen, um die erste anzunehmen ist am billigsten und die letzte ist am teuersten? – Jamiec

+1

+1 für klare Lösung. Zuerst konnte ich 'sort()' in Ihrer Antwort nicht finden. so gemacht Kommentar in der Nähe von Code – diEcho

+0

Ihre Bearbeitung macht keinen Sinn, Sie verwenden 'parseFloat' vor dem Hinzufügen zum Array, so würde Sortieren automatisch numerische Sortierung statt Zeichenfolge verwenden. – Jamiec

3

wenn Sie „zerstreut“ (nicht innerhalb eines Arrays) Werte, die Sie verwenden können:

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

Statt .each, eine andere (vielleicht prägnanter) Ansatz all diese Preise bekommen könnte sein:

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

zusätzlich können Sie das Filtern des Arrays zu prüfen, um loszuwerden, leer oder nicht-numerischen Array-Werte im Falle sollten sie vorhanden sind:

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

dann Sergeys Lösung oben verwenden:

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

Die eleganteste Lösung, imho – borodatych

+0

Der empfohlene Weg. "Die Methode .map() ist besonders nützlich, um den Wert einer Sammlung von Elementen abzurufen oder festzulegen." https://api.jquery.com/map/ – lowtechsun

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

können Sie die Antwort erklären? – fedorqui

0

Verwendung dieses und es funktioniert sowohl auf den statischen Arrays und dynamisch generierte Arrays.

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

Ich hatte das Problem, wenn ich max-Wert von Code unter

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

Ich war immer 'NAN' wenn ich

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

mit meinem Code

Verwandte Themen