在JavaScript中将值传递给Math.max或Math.min函数时,它们分别从输入中返回最高值和最低值。
但是,如果输入了一段未定义的数据,例如
Math.max(5,10,undefined);
返回的结果是NaN。有没有一种简单的方法可以使用JS / jQuery来解决这个问题?
答案 0 :(得分:21)
我认为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
答案 1 :(得分:9)
编写自己的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);
}
使用array filtering缩短或缩短时间:
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
答案 2 :(得分:1)
在将每个号码传递给max
之前,检查每个号码是否已定义。使用sentinel值作为默认值(例如-Infinity
)。对于分钟,您可以使用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
答案 3 :(得分:0)
在我看来,即使更简单,如果您不介意使用d3,也可以执行以下操作:
d3.max([5,10,undefined]) // 10
从d3文档(https://github.com/d3/d3-array#statistics):
使用自然顺序返回给定可迭代的最小值。
...
与内置Math.min不同,此方法将忽略未定义的,null和NaN值; 。此外,使用自然顺序而不是数字顺序比较元素。例如,字符串[“ 20”,“ 3”]的最小值为“ 20”,而数字[20,3]的最小值为3。
答案 4 :(得分:0)
I think a readable solution is to create a fallback:
const a = 1;
const b = undefined;
Math.max(a, b) || 0; // evaluates to 0
答案 5 :(得分:0)
在Math.max中使用虚假
var foo;
Math.max(5, 10, !isNaN(foo) && foo);
var foo;
Math.min(5, 10, !isNaN(foo) && foo);
答案 6 :(得分:0)
如果只期望数字和未定义值的混合,那么它很简单:
Math.max.apply(null, [5, 10, undefined].filter(Number.isInteger))
我认为它也是可读的,只是传达了它的目的。
我们利用Number
primitive wrapper object
来过滤出未定义的值,然后将其传递给Function.prototype.apply()
方法。
请注意,Number
会将字符串或其他值转换为Number
类型,这意味着'123'
之类的值也将被视为数字。
如果您不希望拥有0
或'0'
,甚至可以将其从Number.isInteger
缩短为Number
。如果还要包含浮点数,请将其更改为:Number.isFinite
。
答案 7 :(得分:0)
// Returns largest numeric value; excludes NaN's.
function getMax(...args) {
return Math.max(...args.filter(Number.isFinite));
}