检查布尔键是否存在的最有效方法,并将其包含在if语句中

时间:2015-01-14 11:47:46

标签: javascript

这是两个对象:

var user1 = { test: true }
var user2 = { nope : "noper" }
var user3 = { test: false }

我想检查所有三个对象的测试是否为真。这是最有效的方法吗? (假设我有100k +对象)

var users = [user1, user2, user3]
var users_length = users.length
for(var i = 0; i < users_length; i++)
    if(("test" in users[i]) && users[i].test) { //evals to true }

3 个答案:

答案 0 :(得分:0)

当且仅当函数参数为所有数组元素返回true时,才能使用Array.every()返回true。

var user1 = { test: true }
var user2 = { nope: "noper" }
var users = [user1, user2]

var result = users.every( function( user ) {
    return user.test;
});

console.log( result );

虽然如果你总是只有两个对象,那么user1.test && user2.test就会简单得多。

(请注意"test" in users[i] && users[i].test是多余的,因为如果元素test不存在,那么users[i].test将是假的(未定义)。)

答案 1 :(得分:0)

我个人会做这样简单的事情:

var user1 = { test: true }
var user2 = { nope : "noper" }
var user3 = { test: false }

var users = [user1, user2, user3]
var result = true;

for(var i = 0, j = users.length; i < j; i++){
    result = result && !!users[i].test
    if (!result){
        break;
    }
}

alert(result);

(假设您希望在对象上没有属性&#34; test&#34;时返回false)

这会缓存数组的长度,因此不会在每次循环执行时计算它,然后在遇到false时中断,因为如果是这种情况则没有点继续。这应该会给你更好的表现。 !!将test属性的值强制转换为布尔值,该布尔值是&#39; anded&#39;结果(由于下面的假检查而不是严格需要,但我想添加它以便最终结果是布尔值)。

http://jsfiddle.net/jkyftjpu/

答案 2 :(得分:0)

首先,缓存长度在任何现代浏览器中都是无用的(IE8除外)。 JIT可以轻松地将其缓存。

最有效的代码是:

for(var i = users.length-1; i; i--) { // Reversed iteration is little bit faster
    if((Object.prototype.hasOwnProperty.call(users[i], 'test') && users[i].test) {
        // Your code goes here
    }
}