2012-10-18 12 views
10

Podczas przekazywania wartości do funkcji Math.max lub Math.min w JavaScript, zwracają one odpowiednio najwyższe i najniższe wartości z wejścia.Math.max i Math.min NaN na niezdefiniowanym wpisie

Jeśli jednak wprowadzono niezdefiniowaną część danych, np.

Math.max(5,10,undefined); 

Zwrócony wynik to NaN. Czy istnieje prosty sposób naprawienia tego przy użyciu JS/jQuery?

+0

Możesz napisać własną funkcję otoki do sprawdzania, czy po prostu wdrożyć go samodzielnie. –

Odpowiedz

17

Zakładam, że undefined jest w rzeczywistości zmienną.

Możesz zastąpić -Infinity dla dowolnej wartości NaN, aby zapewnić liczbę.

var foo; 

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

sama koncepcja może być stosowany na Math.min, ale z Infinity:

var foo; 

Math.min(5, 10, isNaN(foo) ? Infinity : foo); // 10 
+0

Dobra odpowiedź! Nie zaszkodzi również uwzględnić implementację Math.min. – cbayram

+0

@cbayram: Dobry pomysł. Zaktualizuję. –

+1

Zamiast 'isNaN (foo)' możesz użyć 'foo == foo', który jest szybszy ([źródło] (http://jsperf.com/nan-check)). – Florent

9

Napisz max funkcję:

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

lub krótszy korzystając array filtering:

function max() { 
    var args = Array.prototype.slice.call(arguments); 
    return Math.max.apply(Math, args.filter(function(val) { 
     return !isNaN(val); 
    })); 
} 

Zastosowanie:

max(5, 10, undefined); // output: 10 
+2

Świetnie, ale czy nie byłoby lepiej użyć 'isNaN'? –

+0

'argumenty' nie jest niestety prawdziwą tablicą. – Yoshi

+0

@Yoshi Prawda. O tym zapomniałem. Dzięki! – VisioN

1

Sprawdź, że każda liczba jest określona przed przekazaniem go do max. Domyślnie używaj wartości wartownika (np. -Infinity). Na min, co chcesz używać 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/

Powiązane problemy