JS对象:
var saver = {
title: false,
preview: false,
body: false,
bottom: false,
locale: false
};
问题是如何检查所有值是否为 false ?
我可以使用$ .each()jQuery函数和一些标志变量,但是可能有更好的解决方案吗?
答案 0 :(得分:18)
这样可以解决问题......
var result = true;
for (var i in saver) {
if (saver[i] === true) {
result = false;
break;
}
}
您可以使用循环来迭代对象,可以是索引或键(如上所述)。
如果您正在整理代码,而不是重复,那么只需将其放入函数中......
Object.prototype.allFalse = function() {
for (var i in this) {
if (this[i] === true) return false;
}
return true;
}
然后你可以随时调用它,就像这样......
alert(saver.allFalse());
这是一个有效的样本......
Object.prototype.allFalse = function() {
for (var i in this) {
if (this[i] === true) return false;
}
return true;
}
var saver = {
title: false,
preview: false,
body: false,
bottom: false,
locale: false
};
console.log("all are false - should alert 'true'");
console.log(saver.allFalse());
saver.body = true;
console.log("one is now true - should alert 'false'");
console.log(saver.allFalse());
答案 1 :(得分:16)
在评论中,您询问是否可以避免迭代。您可以使用支持功能方法的JavaScript库,例如Underscore,Lodash或Sugar。
使用Underscore和Lodash,您可以编写如下内容:
var result = _.every(_.values(saver), function(v) {return !v;});
使用Sugar,您只需写下:
var result = Object.all(saver,false);
答案 2 :(得分:15)
这是一个非常简单的解决方案,需要JavaScript 1.8.5。
Object.keys(obj).every((k) => !obj[k])
示例:
obj = {'a': true, 'b': true}
Object.keys(obj).every((k) => !obj[k]) // returns false
obj = {'a': false, 'b': true}
Object.keys(obj).every((k) => !obj[k]) // returns false
obj = {'a': false, 'b': false}
Object.keys(obj).every((k) => !obj[k]) // returns true
或者你可以写
Object.keys(obj).every((k) => obj[k] == false)
Object.keys(obj).every((k) => obj[k] === false) // or this
Object.keys(obj).every((k) => obj[k]) // or this to return true if all values are true
有关详细信息,请参阅Mozilla Developer Network Object.keys()'s reference。
答案 3 :(得分:5)
它更干净,更容易理解!并且可以节省我们的运行时间,因为一旦函数条件存在一次,它就会退出循环并返回true。
I can see user id, firstname, last name but not group name. How can I show the group name from 'CamundaGroup'?
如果您实际上需要严格的相等性来假,请编写以下代码:
Object.values(obj).some(val => val)
Object.values(obj).some(val => val !== false)
用每个键的值组成一个数组。
答案 4 :(得分:1)
如果你想在没有外部迭代的情况下(即在你的代码中),尝试使用$.map
将属性映射到数组,然后使用$.inArray
来查看是否有存在真值:
var allFalse = $.inArray(true, $.map(saver, function(obj){return obj})) < 0;
答案 5 :(得分:0)
这样做,
for (var i in saver) {
if (saver[i]) {
return false; // here if any value is true it wll return as false /
}
}
return true; //here if all value is false it wll return as true
答案 6 :(得分:0)
从Lodash 4.0开始,可以使用overEvery
overEvery(saver, false)
遍历每个元素&amp;检查是否false
如果每个元素都是true
,则返回false
,否则返回false
答案 7 :(得分:0)
短而方便的单行代码,完全受浏览器支持:
Object.keys(saver).every(k => saver[k] === false);
或
Object.values(saver).every(v => v === false);
( IE 目前尚不支持Object.values()。)
答案 8 :(得分:0)
使用lodash,您还可以进行const result = _.some(saver);
答案 9 :(得分:0)
Lodash(3.10.1+)使它更清晰地表达:
storyboard
但每ngstschr's answer使用_.every({a: false, b: false, c: false}, _.negate(Boolean)); // True
更为简洁。
答案 10 :(得分:0)
这应该在所有主流浏览器上都可以使用:
Object.keys(saver).every(key => saver[key] === false); // return true
答案 11 :(得分:0)
const hasFalsyValue = (list) =>
!list.every(obj => Object.values(obj).every(prop => prop))
我发现这有助于防止进一步传递 null/falsy 值:
const listA = [ { a:'?', b:100 }, { a:'?', b:200 } ]
const listB = [ { a:null, b:100 }, { a:'?', b:200 } ]
// hasFalsyValue(listA) === false
// hasFalsyValue(listB) === true
我们应该注意一个细节:
⚠️ 在 Javascript 中 0 和 '' 是假值! ⚠️
因此,如果 hasFalsyValue() 在数组中的对象内找到任何零值或任何空字符串值,它将认为它是一个假值并因此返回真!
...虽然这可能是您想要的,但有时您可能希望允许任何特定的 Falsy 值被视为真值。
✍? 假设您想在对象中允许零值,您可以执行以下操作:
const hasFalsyValue_ZeroAllowed =
(list) => !list.every(obj => Object.values(obj).every(prop => prop || prop === 0))
现在零值不再被认为是假的:
const listC = [ { a:0, b:100 }, { a:'?', b:200 } ]
const listD = [ { a: null, b:100 }, { a:'?', b:200 } ]
hasFalsyValue_ZeroAllowed(listC) // false
hasFalsyValue_ZeroAllowed(listD) // true
您可以继续向函数添加更多条件以进行定制验证:
✍? 允许空值:
const hasFalsyValue_NullAllowed =
(list) => !list.every(obj => Object.values(obj).every(prop => prop || prop === null))
const listE = [ { a: null, b:100 }, { a:'?', b:200 } ]
hasFalsyValue_NullAllowed(listE) // false
✍? 允许空字符串值:
const hasFalsyValue_EmptyStringAllowed =
(list) => !list.every(obj => Object.values(obj).every(prop => prop || prop === ''))
const listF = [ { a: '', b:100 }, { a:'?', b:200 } ]
hasFalsyValue_EmptyStringAllowed(listF) // false