Ответ 1
Чтобы получить значение min/max в массиве, вы можете использовать:
var _array = [1,3,2];
Math.max.apply(Math,_array); // 3
Math.min.apply(Math,_array); // 1
Я создаю следующий массив из атрибутов данных, и мне нужно уметь извлекать из него самое высокое и самое низкое значение, чтобы позже передать его другой функции.
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
Получилось ощущение, что это глупо простой вопрос, поэтому, пожалуйста, будьте добры:)
Чтобы получить значение min/max в массиве, вы можете использовать:
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]
, поскольку 11.5
рассматривается как строка и будет до 3.x
в словаре, вам нужно перейдите в пользовательскую функцию сортировки, чтобы убедиться, что они действительно рассматриваются как float:
prices.sort(function(a, b) { return a - b });
Вместо .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);
если у вас есть "разбросанные" (не внутри массива) значения, которые вы можете использовать:
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);
с моим кодом