Получить максимальное и минимальное значение из массива в 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

мои элементы списка выглядят так (я сократил для удобства чтения):

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

быстрая консоль.log on prices показывает мне мой массив, который кажется отсортированным, чтобы я мог захватить первый и последний элемент, который я предполагаю, но в настоящее время имена и значения в массиве одинаковы всякий раз, когда я пытаюсь сделать цены[0], я получаю undefined

[]
19.38   19.38
20.00   20.00
29.97   29.97
31.00   31.00

есть ощущение, что это глупо простой вопрос, поэтому, пожалуйста, будьте добры:)

6 ответов


чтобы получить минимальное / максимальное значение в массиве, вы можете использовать:

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

почему бы не сохранить его как массив цены, а не объект?

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

таким образом, вы можете просто

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

обратите внимание, что вы можете сделать shift() и pop() чтобы получить минимальную и максимальную цену соответственно, но это снимет цену с массива.

еще лучшая альтернатива-использовать решение Сергея ниже, используя Math.max и min соответственно.

EDIT:

я понял, что это было бы неправильно, если у вас что-то вроде [11.5, 3.1, 3.5, 3.7] as 11.5 обрабатывается как строка, и до the 3.x в порядке словаря вам нужно передать пользовательскую функцию сортировки, чтобы убедиться, что они действительно рассматриваются как float:

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

вместо .каждый, другой (возможно, более краткий) подход к получению всех этих цен может быть:

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

кроме того, вы можете рассмотреть возможность фильтрации массива, чтобы избавиться от пустых или нечисловых значений массива, если они должны существовать:

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

затем используйте решение Сергея выше:

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

если у вас есть" разбросанные " (не внутри массива) значения, вы можете использовать:

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

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

используйте это, и он работает как на статических массивах, так и на динамически генерируемых массивах.

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

у меня была проблема, когда я пытаюсь найти максимальное значение из кода ниже

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

Я получил 'NAN' когда я использую

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

С кодом