web-dev-qa-db-fra.com

Obtenir les valeurs max et min d'un tableau en JavaScript

Je crée le tableau suivant à partir d'attributs de données et je dois être capable de récupérer la valeur la plus élevée et la plus basse afin de pouvoir le transmettre ultérieurement à une autre fonction.

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

Les éléments de ma liste ressemblent à ceci (j'ai réduit la lisibilité):

<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 rapide console.log sur les prix me montre mon tableau qui semble être trié afin que je puisse récupérer le premier et le dernier élément que je suppose, mais actuellement, les noms et les valeurs du tableau sont identiques, donc chaque fois que j'essaie de faire un price [0 ], Je reçois undefined

[]
19.38   19.38
20.00   20.00
29.97   29.97
31.00   31.00

Vous avez le sentiment que c'est une question stupidement facile, alors s'il vous plaît soyez gentil :)

47
RJB

Pour obtenir une valeur min/max dans un tableau, vous pouvez utiliser:

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

Au lieu de .each, une autre approche (peut-être plus concise) pour obtenir tous ces prix pourrait être:

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

en outre, vous pouvez envisager de filtrer le tableau pour vous débarrasser des valeurs de tableau vides ou non numériques au cas où elles existeraient:

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

puis utilisez la solution de Sergey ci-dessus:

var max = Math.max.apply(Math,prices);
var min = Math.min.apply(Math,prices);
11
billynoah

Pourquoi ne pas le stocker comme un tableau de prix au lieu d'objet?

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 cette façon, vous pouvez simplement

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

Notez que vous pouvez utiliser shift() et pop() pour obtenir le prix minimum et le prix maximum, mais cela enlèvera le prix du tableau.

Une alternative encore meilleure consiste à utiliser la solution Sergei ci-dessous, en utilisant respectivement Math.max et min.

MODIFIER:

J'ai réalisé que ce serait faux si vous avez quelque chose comme [11.5, 3.1, 3.5, 3.7] car 11.5 est traité comme une chaîne, et viendrait avant le 3.x dans l'ordre du dictionnaire, vous devez passer en fonction de tri personnalisé pour vous assurer qu'ils sont vraiment traités comme float:

prices.sort(function(a, b) { return a - b });
11
Andreas Wong

si vous avez des valeurs "dispersées" (pas dans un tableau), vous pouvez utiliser:

var max_value = Math.max(val1, val2, val3, val4, val5);
3
rvandoni
arr = [9,4,2,93,6,2,4,61,1];
ArrMax = Math.max.apply(Math, arr);
1
MIqayel Ishkhanyan

utilisez ceci et cela fonctionne à la fois sur les tableaux statiques et sur les tableaux générés dynamiquement. 

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

J'ai eu le problème lorsque j'utilise pour essayer de trouver la valeur maximale du code ci-dessous 

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

Je recevais 'NAN' quand j'utilise 

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

avec mon code 

0
Sodhi saab

Trouver le plus grand et le plus petit nombre dans un tableau avec lodash.

var array = [1, 3, 2];
var func = _.over(Math.max, Math.min);
var [max, min] = func(...array);
// => [3, 1]
console.log(max);
console.log(min);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

0
Yi-Ting Liu