未定义条目上的Math.max和Math.min NaN

时间:2012-10-18 14:47:32

标签: javascript jquery

在JavaScript中将值传递给Math.max或Math.min函数时,它们分别从输入中返回最高值和最低值。

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

Math.max(5,10,undefined);

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

8 个答案:

答案 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

http://jsfiddle.net/QTckE/

答案 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));
}