2016-06-07 43 views
0

我有一個對象有幾個字段可能會被轉換爲真實的用戶(想像成就列表)。如果我有像{one: true, two: false, three: true}這樣的對象,我將如何逃避該函數的執行(因爲並非所有的鍵都是真的)?這是我到目前爲止已經試過:JS - 檢查一個對象的所有屬性是否都是真的

for (var key in achis) { 
    if (achis.hasOwnProperty(key)) { 
     if (key === false) { 
      cb && cb(); 
      return; 
     } 
    } 
} 
achievements.update({userId: achis.userid}, {$set: {all: true}}, function(err) { 
    if (err) { 
     console.log(err); 
    } 
    cb && cb(); 
    return; 
}); 

我怎麼能夠只更新acheivements文檔領域的「全能」爲true,如果所有的鍵achis值是「真」是這樣的:{one: true, two: true, three: true}

回答

0

key只是給你的屬性名稱。如果你想得到價值使用archis[key]

0

您似乎已經擁有基本邏輯,除了您正在比較key而不是您使用該密鑰obj[key]引用的value

由於性能測試都是同步的,你可以把它變成一個簡單的功能是這樣的:

function testAllProperties(obj, val) { 
    for (var key in obj) { 
     if (obj.hasOwnProperty(key)) { 
      if (obj[key] !== val) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 


if (testAllProperties(achis, true)) { 
    // all properties are true 
} else { 
    // some properties are not true 
} 
0

陣列every()與真理的檢查是做測試的好辦法,當你引用的鍵物體。

var obj = { 
 
a: true, 
 
b: true 
 
} 
 

 
var isAllTrue = Object.keys(obj).every(function (key) { 
 
    return obj[key]===true; 
 
}); 
 
console.log(isAllTrue);

+0

或者['Object.values'](https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Object/values)如果節點支持它 – Oriol

0

Array.prototype.every()是理想的解決方案。

var o1 = {one: true, two: false, three: true}, 
 
    o2 = {one: true, two: true, three: true}, 
 
    CB = _ => console.log("I am doing something because the object is all true"), 
 
runCB = o => Object.keys(o).every(k => o[k]) && CB(); 
 
runCB(o1); 
 
runCB(o2);

0

在新的瀏覽器的可用最短的方法將是:

var obj = { a: true, b: true } 

var allTrue = Object.values(obj).every(val => val); 
相關問題