Math.max и Math.min NaN на входе undefined
При передаче значений функции Math.max или Math.min в JavaScript они возвращают наивысшие и самые низкие значения из ввода соответственно.
Однако, если введен фрагмент данных undefined, например
Math.max(5,10,undefined);
Возвращаемый результат - NaN. Есть ли простой способ исправить это с помощью JS/jQuery?
Ответы
Ответ 1
Я предполагаю, что undefined
на самом деле является некоторой переменной.
Вы можете заменить -Infinity
на любое значение NaN
чтобы обеспечить число.
var foo;
Math.max(5, 10, isNaN(foo) ? -Infinity : foo); // returns 10
Та же концепция может быть использована в Math.min
, но с Infinity
:
var foo;
Math.min(5, 10, isNaN(foo) ? Infinity : foo); // returns 5
Ответ 2
Напишите свою собственную функцию max
:
function max() {
var par = []
for (var i = 0; i < arguments.length; i++) {
if (!isNaN(arguments[i])) {
par.push(arguments[i]);
}
}
return Math.max.apply(Math, par);
}
Или более короткое использование фильтрации массива:
function max() {
var args = Array.prototype.slice.call(arguments);
return Math.max.apply(Math, args.filter(function(val) {
return !isNaN(val);
}));
}
Использование:
max(5, 10, undefined); // output: 10
Ответ 3
Убедитесь, что каждый номер определен, прежде чем передать его на max
. Использовать значение по умолчанию (например, -Infinity
). Для min вы хотели бы использовать Infinity
:
var a = 5;
var b = 10;
var c = undefined;
var defaultForMax = function (num) {
return typeof num === 'number' ? num : -Infinity;
};
c = defaultForMax(c); // c is now -Infinity
Math.max(a, b, c); // 10
http://jsfiddle.net/QTckE/
Ответ 4
Еще проще, на мой взгляд, если вы не возражаете против использования d3, вы можете сделать следующее:
d3.max([5,10,undefined]) // 10
Из документации d3 (https://github.com/d3/d3-array#statistics):
Возвращает минимальное значение в данной итерации, используя естественный порядок.
...
В отличие от встроенного Math.min, этот метод игнорирует значения undefined, null и NaN; это полезно для игнорирования отсутствующих данных. Кроме того, элементы сравниваются с использованием естественного порядка, а не числового порядка. Например, минимум строк ["20", "3"] равен "20", а минимум чисел [20, 3] - 3.
Ответ 5
Я думаю, что удобочитаемым решением является создание запасного варианта:
const a = 1;
const b = undefined;
Math.max(a, b) || 0; // evaluates to 0