2012-08-16 4 views
42

Sto creando il seguente array dagli attributi dei dati e ho bisogno di essere in grado di prendere il valore più alto e più basso da esso in modo che possa passarlo a un'altra funzione in seguito.Ottieni il valore massimo e minimo dall'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 

mie voci di elenco simile a questo (ho tagliato verso il basso per migliorare la leggibilità):

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

Un console.log rapido sui prezzi mi mostra la mia serie che sembra essere ordinato in modo da poter afferrare il primo e l'ultimo elemento assumo, ma presto i nomi ei valori nella matrice sono uguali, quindi ogni volta che provo e fare un prezzi [0], ottengo indefinito

[] 
19.38 19.38 
20.00 20.00 
29.97 29.97 
31.00 31.00 

Hai la sensazione che questa sia una domanda stupidamente facile, quindi per favore sii gentile :)

+0

shouldn 'questo' prezzi [prezzo] 'è questo:' prices.push() 'per usare i tasti [0], [1] ...? –

+0

Quanti prezzi potresti avere? – phenomnomnominal

risposta

141

per ottenere min/max valore in matrice, è possibile utilizzare:

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

Ho usato 'Math.max.apply (null, _array)' e ha funzionato bene. Qualche ragione per non farlo in quel modo? –

+0

@ButtleButkus è possibile utilizzare 'null' senza alcun problema per il caso corrente. I ragazzi di Mozilla lo usano anche come primo parametro in [i loro esempi su 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);' –

+0

Da ES6, è possibile utilizzare la diffusione dell'array: '' 'Math.max (... array);' '' – krmld

11

Perché non memorizzarlo come una matrice di prezzi anziché oggetto?

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 

In questo modo si può solo

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

Nota che si può fare e shift()pop() per ottenere, rispettivamente minimo e il prezzo massimo, ma ci vorrà del prezzo dalla matrice.

Un'alternativa ancora migliore consiste nell'utilizzare la soluzione di Sergei di seguito, utilizzando rispettivamente Math.max e min.

EDIT:

ho capito che questo sarebbe sbagliato se avete qualcosa come [11.5, 3.1, 3.5, 3.7] come 11.5 viene trattata come una stringa, e sarebbe venuto prima il 3.x al fine dizionario, è necessario passare a ordinamento personalizzato funzione per assicurarsi che siano effettivamente trattati come float:

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

sicuramente devi ordinare l'elenco da qualche parte per assumere che il primo è più economico e l'ultimo è più costoso? – Jamiec

+1

+1 per una soluzione chiara. all'inizio non riuscivo a trovare 'sort()' nella tua risposta. così fatto commento vicino al codice – diEcho

+0

La tua modifica non ha senso, stai usando 'parseFloat' prima di aggiungere all'array, quindi sort ordina automaticamente l'ordinamento numerico piuttosto che la stringa. – Jamiec

3

se si è "disperso" (non all'interno di un array) valori che è possibile utilizzare:

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

Invece di .Ogni, un altro (forse più conciso) approccio per ottenere tutti quei prezzi potrebbe essere:

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

inoltre si può prendere in considerazione la matrice filtraggio per sbarazzarsi di valori di matrice vuoti o non numerici nel caso in cui dovrebbero esistere:

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

poi usare la soluzione di Sergey sopra:

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

La soluzione più elegante, imho – borodatych

+0

Il modo consigliato. "Il metodo .map() è particolarmente utile per ottenere o impostare il valore di una raccolta di elementi." https://api.jquery.com/map/ – lowtechsun

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

puoi spiegare la risposta? – fedorqui

0

uso questo e funziona su entrambe le matrici statiche e matrici generati dinamicamente.

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

ho avuto il problema quando ho inutile cercare di trovare il valore massimo dal codice qui sotto

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

mi è stato sempre 'NAN' quando uso

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

con il mio codice