这是两个对象:
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 }
答案 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;结果(由于下面的假检查而不是严格需要,但我想添加它以便最终结果是布尔值)。
答案 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
}
}