Tally Javascript对象属性值

时间:2015-05-19 01:18:21

标签: javascript arrays object

我在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

2 个答案:

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