2012-08-16 25 views
42

Estoy creando la siguiente matriz a partir de los atributos de datos y necesito poder obtener el valor más alto y más bajo para poder pasarla a otra función más adelante.Obtenga el valor máximo y mínimo de la matriz en 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 

Mis elementos de la lista siguiente aspecto (He reducido para facilitar la lectura):

<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 rápida en los precios me muestra mi matriz que parece ser ordenados para que pudiera agarrar el primer y último elemento supongo, pero en la actualidad los nombres y valores de la matriz son los mismos para que cada vez que trato de hacer unos precios [0], consigo indefinido

[] 
19.38 19.38 
20.00 20.00 
29.97 29.97 
31.00 31.00 

Tengo la sensación de que esta es una pregunta estúpidamente fácil, así que sea amable :)

+0

no deben 't this 'prices [price]' be this: 'prices.push()' para usar las teclas [0], [1] ...? –

+0

¿Cuántos precios es probable que tenga? – phenomnomnominal

Respuesta

141

para obtener min/valor máximo en orden de batalla, puede utilizar:

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

He usado 'Math.max.apply (null, _array)' y funcionó bien. ¿Alguna razón para no hacerlo de esa manera? –

+0

@ButtleButkus puede usar 'null' sin ningún problema para el caso actual. Los chicos de Mozilla también lo usan como primer parámetro en [sus ejemplos en 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, números);' –

+0

Desde ES6, puede usar la dispersión de array: '' 'Math.max (... array);' '' – krmld

11

¿Por qué no almacenarlo como una matriz de precios en lugar de objeto?

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 

De esa manera usted puede simplemente

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

Tenga en cuenta que usted puede hacer shift() y pop() para conseguir minutos y el precio máximo, respectivamente, pero tomará un descuento en el precio de la matriz.

Una alternativa aún mejor es usar la solución de Sergei a continuación, usando Math.max y min respectivamente.

EDIT:

me di cuenta de que esto sería un error si tiene algo así como [11.5, 3.1, 3.5, 3.7] como 11.5 se trata como una cadena, y vendría antes la 3.x con el fin de diccionario, que necesita para pasar de ordenación personalizada función para asegurarse de que son tratados de hecho como float:

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

seguramente tiene que pedir la lista en alguna parte para asumir que la primera es la más barata y la última es la más cara. – Jamiec

+1

+1 para una solución clara. al principio no pude encontrar 'sort()' en tu respuesta. por lo que hizo comentarios cerca del código – diEcho

+0

Su edición no tiene sentido, está usando 'parseFloat' antes de agregarla a la matriz, por lo que sort usaría automáticamente la clasificación numérica en lugar de la cadena. – Jamiec

3

si ha "dispersado" (no dentro de una matriz) valores que se pueden utilizar:

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

En lugar de .Cada, otro enfoque (tal vez más concisa) para conseguir todos esos precios podría ser:

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

, además, es posible que desee considerar la posibilidad de filtrar la matriz para deshacerse de los valores matriz vacía o no numéricos en caso de que deberían existir:

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

a continuación, utilizar la solución de Sergey arriba:

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

La solución más elegante, imho – borodatych

+0

La forma recomendada. "El método .map() es particularmente útil para obtener o establecer el valor de una colección de elementos". https://api.jquery.com/map/ – lowtechsun

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

¿Puedes explicar la respuesta? – fedorqui

0

uso esto y que funciona tanto en los arreglos estáticos y matrices generadas dinámicamente.

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

que tenían el problema cuando uso tratando de encontrar el valor máximo de la clave siguiente

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

que estaba recibiendo 'NAN' cuando uso

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

con mi código

Cuestiones relacionadas