Получить максимальное и минимальное значение из массива в 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);
используйте это, и он работает как на статических массивах, так и на динамически генерируемых массивах.
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);
С кодом