20

在 JavaScript中将值传递给Math.maxorMath.min函数时,它们分别返回输入中的最大值和最小值。

但是,如果输入了一条未定义的数据,例如

Math.max(5,10,undefined);

返回的结果是NaN。有没有一种简单的方法可以使用 JS/jQuery 来解决这个问题?

4

7 回答 7

28

I assume the undefined is actually some variable.

You can substitute -Infinity for any NaN value to ensure a number.

var foo;

Math.max(5, 10, isNaN(foo) ? -Infinity : foo); // returns 10

Same concept can be used on Math.min, but with Infinity:

var foo;

Math.min(5, 10, isNaN(foo) ? Infinity : foo); // returns 5
于 2012-10-18T14:49:28.400 回答
11

编写自己的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
于 2012-10-18T14:52:45.550 回答
2

它很简单:

// ES6 (returns: 10)
Math.max(...[5, 10, undefined].filter(Number.isFinite))

或者:

// ES5 (returns: 10)
Math.max.apply(null, [5, 10, undefined].filter(Number.isFinite))

我认为它是可读的,并且只是传达了它的目的。

说明:我们利用, 过滤掉未定义的值,然后将其作为参数传递给函数,在 ES6 中使用扩展运算符,或者在 ES5 中使用方法。Number primitive wrapper objectMath.maxFunction.prototype.apply()

于 2020-11-11T00:24:50.117 回答
1

Check that each number is defined before passing it to max. Use an sentinel value as a default (such as -Infinity). For min you would want to use 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/

于 2012-10-18T14:58:35.567 回答
0
// Returns largest numeric value; excludes NaN's.
function getMax(...args) {
 return Math.max(...args.filter(Number.isFinite));
}
于 2021-01-20T01:44:11.307 回答
0

在 Math.max 中使用 falsy

var foo;

Math.max(5, 10, !isNaN(foo) && foo);
var foo;

Math.min(5, 10, !isNaN(foo) && foo);
于 2020-05-27T04:33:40.773 回答
0

在我看来更简单,如果您不介意使用 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。

于 2019-04-12T13:22:00.753 回答