在 JavaScript中将值传递给Math.max
orMath.min
函数时,它们分别返回输入中的最大值和最小值。
但是,如果输入了一条未定义的数据,例如
Math.max(5,10,undefined);
返回的结果是NaN
。有没有一种简单的方法可以使用 JS/jQuery 来解决这个问题?
在 JavaScript中将值传递给Math.max
orMath.min
函数时,它们分别返回输入中的最大值和最小值。
但是,如果输入了一条未定义的数据,例如
Math.max(5,10,undefined);
返回的结果是NaN
。有没有一种简单的方法可以使用 JS/jQuery 来解决这个问题?
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
编写自己的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
它很简单:
// 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 object
Math.max
Function.prototype.apply()
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
// Returns largest numeric value; excludes NaN's.
function getMax(...args) {
return Math.max(...args.filter(Number.isFinite));
}
在 Math.max 中使用 falsy
var foo;
Math.max(5, 10, !isNaN(foo) && foo);
var foo;
Math.min(5, 10, !isNaN(foo) && foo);
在我看来更简单,如果您不介意使用 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。