2016-06-07 2 views
0

У меня есть объект, который имеет несколько полей, которые потенциально могут быть перенесены в true для пользователя (подумайте, как список достижений). Если бы у меня был такой объект, как {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 DOC «все» истинно, если все ключевые значения в Анхусу является «истинным», как это: {one: true, two: true, three: true}

ответ

0

key просто дает вам название свойства. Если вы хотите использовать значение archis[key].

0

У вас уже есть базовая логика, за исключением того, что вы сравниваете key вместо value, с которым вы ссылаетесь, используя этот ключ obj[key].

Поскольку тесты собственности все синхронные, вы можете поместить его в простую функцию:

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); 
Смежные вопросы