2012-10-18 29 views
10

Khi chuyển giá trị cho hàm Math.max hoặc Math.min trong JavaScript, chúng trả lại giá trị cao nhất và thấp nhất từ ​​đầu vào tương ứng.Math.max và Math.min NaN trên mục nhập không xác định

Tuy nhiên, nếu một phần dữ liệu không xác định được nhập, ví dụ:

Math.max(5,10,undefined); 

Kết quả trả về là NaN. Có cách nào đơn giản để sửa lỗi này bằng JS/jQuery không?

+0

Bạn có thể viết chức năng bao bọc của riêng bạn để kiểm tra, hoặc chỉ đơn giản là thực hiện nó cho mình. –

Trả lời

17

Tôi giả định undefined thực sự là một số biến.

Bạn có thể thay thế -Infinity cho bất kỳ giá trị NaN nào để đảm bảo số.

var foo; 

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

Cùng khái niệm có thể được sử dụng trên Math.min, nhưng với Infinity:

var foo; 

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

Câu trả lời hay! Sẽ không bị tổn thương để bao gồm việc thực hiện Math.min là tốt. – cbayram

+0

@cbayram: Ý tưởng hay. Tôi sẽ cập nhật. –

+1

Thay vì 'isNaN (foo)' bạn có thể sử dụng 'foo == foo' nhanh hơn ([source] (http://jsperf.com/nan-check)). – Florent

9

Viết riêng max chức năng của bạn:

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

Hoặc ngắn sử dụng array filtering:

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

Cách sử dụng:

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

Tuyệt vời, nhưng sẽ không tốt hơn nếu sử dụng 'isNaN'? –

+0

'đối số' không phải là một mảng thực sự, thật không may. – Yoshi

+0

@Yoshi True. Đó là những gì tôi quên mất. Cảm ơn! – VisioN

1

Kiểm tra xem mỗi số được xác định trước khi đi qua nó để max. Sử dụng giá trị sentinel làm giá trị mặc định (chẳng hạn như -Infinity). Đối phút bạn sẽ muốn sử dụng 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/

Các vấn đề liên quan