2013-06-14 24 views
13

Trong JavaScript, tôi cần phải biết nếu tất cả các mục đối tượng được đặt thành true.Làm cách nào để biết liệu tất cả các giá trị đối tượng javascript có đúng không?

Nếu tôi có các đối tượng sau đây:

var myObj = {title:true, name:true, email:false}; 

tôi có thể viết một cái gì đó như thế này:

if(myObj.title && myObj.name && myObj.email){ 
/*Some code */ 
}; 

Nhưng tôi đang tìm kiếm những cách đơn giản nhất để viết nó. ví dụ:

if(myObj all is true){ 
/*Some code */ 
}; 

Tôi có thể có một đối tượng khác có 10-20 mục bên trong và cần phải biết tất cả có đúng không.

Trả lời

15

Làm thế nào về một cái gì đó như:

function allTrue(obj) 
 
    { 
 
     for(var o in obj) 
 
      if(!obj[o]) return false; 
 
     
 
     return true; 
 
    } 
 
    
 
    var myObj1 = {title:true, name:true, email:false}; 
 
    var myObj2 = {title:true, name:true, email:true}; 
 

 
    document.write('<br />myObj1 all true: ' + allTrue(myObj1)); 
 
    document.write('<br />myObj2 all true: ' + allTrue(myObj2)); 
 

 

Một vài kỹ khuyến cáo: này sẽ trở lại true nếu tất cả các giá trị là đúng-ish, không nhất thiết phải chính xác bằng các giá trị Boolean Của sự thật. Ngoài ra, nó sẽ quét tất cả các thuộc tính của đối tượng được truyền trong đối tượng, bao gồm cả mẫu thử nghiệm của nó. Điều này có thể hoặc có thể không phải là những gì bạn cần, tuy nhiên nó sẽ làm việc tốt trên một đối tượng đơn giản nghĩa đen như một trong những bạn cung cấp.

+0

Vâng, đó là những gì tôi đang tìm kiếm. – napalias

+2

Bạn cũng bao gồm việc kiểm tra 'hasOwnProperty' nếu không các nguyên mẫu đối tượng có thể gây cản trở –

+1

Vâng, tôi đã nghĩ về việc bao gồm điều đó nhưng hình dung nó sẽ làm phức tạp ví dụ quá nhiều. Vì vậy, tôi đã chỉ ra điều đó trong tuyên bố từ chối trách nhiệm của mình. –

19

Trong trình duyệt hiện đại:

var allTrue = Object.keys(myObj).every(function(k){ return myObj[k] }); 

Nếu bạn thực sự muốn kiểm tra cho true chứ không phải chỉ là một giá trị truthy:

var allTrue = Object.keys(myObj).every(function(k){ return myObj[k] === true }); 
+0

hoặc tốt hơn, làm cho nó có thể sử dụng lại được: Object.keys (myObj) .every (function (k) {return this [k]}, myObj); – dandavis

1

cách nhanh nhất là một vòng lặp

for(var index in myObj){ 
    if(!myObj[index]){ //check if it is truly false 
    var fail = true 
    } 
} 
if(fail){ 
    //test failed 
} 

Điều này sẽ lặp lại tất cả các giá trị trong mảng rồi kiểm tra nếu giá trị là false và nếu nó là sau đó nó sẽ thiết lập biến thất bại, phù thủy sẽ cho bạn biết rằng thử nghiệm thất bại.

+2

Có lẽ không có lý do gì để tiếp tục vòng lặp khi bạn tìm thấy một giá trị không thành công. –

+0

Yep ... Bạn có thể sử dụng 'break' để thoát khỏi vòng lặp hoặc đơn giản trả về false nếu đoạn mã này là một phần của hàm (có thể là). – jahroy

+0

Rất đúng, bỏ qua khía cạnh đó. Tôi đoán ứng dụng này đang chờ đợi không nhiều giá trị thực tế trong đối tượng, trong trường hợp phù thủy này sẽ không gây hại nhiều. –

0

Với thực lodash:

var myObj = {a: true, b: true, c: undefined}; 
_.every(_.values(myObj), (value) => value == true); 
Các vấn đề liên quan