如何检查所有对象键是否具有错误值

时间:2014-05-12 08:53:16

标签: javascript jquery arrays javascript-objects

JS对象:

var saver = {
        title: false,
        preview: false,
        body: false,
        bottom: false,
        locale: false
};

问题是如何检查所有值是否为 false

我可以使用$ .each()jQuery函数和一些标志变量,但是可能有更好的解决方案吗?

12 个答案:

答案 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库,例如UnderscoreLodashSugar

使用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)

使用array.some()

它更干净,更容易理解!并且可以节省我们的运行时间,因为一旦函数条件存在一次,它就会退出循环并返回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;

JSFiddle:http://jsfiddle.net/TrueBlueAussie/FLhZL/1/

答案 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