Подтвердить что ты не робот

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

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

[]
19.38   19.38
20.00   20.00
29.97   29.97
31.00   31.00

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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], поскольку 11.5 рассматривается как строка и будет до 3.x в словаре, вам нужно перейдите в пользовательскую функцию сортировки, чтобы убедиться, что они действительно рассматриваются как float:

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

с моим кодом