我在Javascript中的数组中有几个对象。该对象如下所示:
model: [
{
category: 'Media',
value: '',
checked: false
},
{
category: 'Entertainment',
value: '',
checked: false
},
{
category: 'Music',
value: '',
checked: false
},
{
category: 'Theater',
value: '',
checked: false
}
]
我想循环遍历这个对象数组,并计算出checked: true
值的数量。如果所有这些都等于true
,我想运行一个函数。如何查看所有checked
值是否等于true
?
答案 0 :(得分:2)
最简单的方法是使用Array.prototype.reduce
:
var aggregate = function (arr) {
return arr.reduce(function (p, c) {
return c.checked ? p + 1 : p;
}, 0);
}
if (aggregate(model) === model.length) {
// call your function
}
修改强>
正如@Bergi所指出的,使用Array.prototype.every
中的the comments above解决方案的速度更快,因为.every
终止于回调返回的第一个实例false
:
var allChecked = function (arr) {
return arr.every(function (item) {
return item.checked;
});
}
if (allChecked(model)) {
// call your function
}
虽然,如果你在演出之后,使用for循环会更快:
var allChecked = function (arr) {
for (var i = arr.length; --i;)
if (!arr[i].checked) return false;
return true;
}
答案 1 :(得分:1)
正如Xufox和royhowie所说,every()是最佳选择:
obj.model.every(val=>val.checked); // ES6
obj.model.every(function(val){ return val.checked; }); //ES5.1+
如果你想玩原型:
Array.prototype.countWhenField = function(field){this._field=field; return this};
Array.prototype.isEqualTo = function(val){
var arr = this,
fld = this._field;
// using reduce() here as an example, but can use every()
return arr.reduce(function (prev, curr) {
return curr[fld] == val ? prev + 1 : prev;
},0);
};
var obj = {
model : [
{
category: 'Media',
value: '',
checked: true
},
{
category: 'Entertainment',
value: '',
checked: true
},
{
category: 'Music',
value: '',
checked: false
},
{
category: 'Theater',
value: '',
checked: true
}
]
};
console.log(
obj.model.countWhenField('checked').isEqualTo(true), // 3
obj.model.length // 4
);
建议是出于各种原因远离原型(特别是不要对基础Object或Array类进行原型设计)。以上是可怕的示例,并且 在任何方式 都不能在生产代码中使用(太多问题需要在短时间内指出)
重要的是要注意,以上只是一个简单的示例,演示如何制作更多 english (例如arr.countWhenField('checked').isEqualTo(true) == arr.length
)。