[英]JS - Check if all an object's own properties are true
我有一个对象,其中包含多个字段,对于用户而言可能会变为true(想像成就列表)。 如果我有一个像{one: true, two: false, three: true}
,我将如何转义函数的执行(因为并非所有键都为true)? 到目前为止,这是我尝试过的:
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;
});
如果achis中的所有键值都为“ true”,我将如何仅将实现doc字段“ all”更新为true: {one: true, two: true, three: true}
当您引用对象的键时,用真值检查将every()
数组排列成数组是一种很好的测试方法。
var obj = { a: true, b: true } var isAllTrue = Object.keys(obj).every( function (key) { return obj[key]===true; }); console.log(isAllTrue);
您似乎已经具有基本逻辑,只是要比较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
}
较新的浏览器中可用的最短方法是:
var obj = { a: true, b: true }
var allTrue = Object.values(obj).every(val => val);
key
只为您提供属性名称。 如果要获取值,请使用archis[key]
。
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.