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