it-roy-ru.com

Получить максимальное и минимальное значение из массива в 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 ], Я получаю неопределено

[]
19.38   19.38
20.00   20.00
29.97   29.97
31.00   31.00

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

47
RJB

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

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

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

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

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

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(), чтобы получить минимальную и максимальную цену соответственно, но это приведет к удалению цены из массива.

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

Правка:

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

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

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

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

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

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

с моим кодом 

0
Sodhi saab

Найдите наибольшее и наименьшее число в массиве с помощью 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