在JavaScript中使用reduce或filter计算对象数量

3

我已经编写了一个方法来计算数组中“enabled”设置为“true”的对象数量。

每次找到数组中“enabled”设置为“true”的对象时,我都会将计数器加1。

如何在不使用“counter”变量的情况下,使用reduce或filter实现这一点呢?

以下是我的代码:

function getCount() {               
    const arr =[[{ "enabled": true }], [{ "enabled": false}, {"enabled": true}]];                       
    var count = 0;
    arr.forEach(function(ar){
        ar.forEach(function(obj){
            if(obj.enabled) {
                count++;
            }
        })
    });
    return count;           
}

obj.seatMapAvailable是什么?你是不是想说obj.enabled - StudioTime
是的,没错,我已经纠正了!我想使用 ES6 中的 reduce。 - Sunny
4个回答

8
请看下面,我添加了一条注释:
[].concat(...arr) /* flatten the array */
.filter(item => item.enabled) /* return only enabled: true */
.length /* get the count */

const arr = [
  [{
    "enabled": true
  }],
  [{
    "enabled": false
  }, {
    "enabled": true
  }]
];
var enabledCount = [].concat(...arr).filter(item => item.enabled).length
console.log(enabledCount)

如果您愿意,您也可以使用reduce

const arr = [
  [{
    "enabled": true
  }],
  [{
    "enabled": false
  }, {
    "enabled": true
  }]
];

var enabledCount = arr.reduce(
  (accumulator, currentValue) => accumulator.concat(currentValue), []
).filter(item => item.enabled).length

console.log(enabledCount)


我想使用ES6中的reduce函数。 - Sunny
我已经添加了一个reduce示例。 - StudioTime

2

在我看来,使用帮助函数reduce可以得到最简单的实现:

const arr =[
 [
     {"enabled": true},
     {"enabled": true}
 ],
 [
     {"enabled": false}, 
     {"enabled": true},
     {"enabled": true}
 ]
]; 

// Helper function to count inner arrays
const r = (i) => i.reduce( (p, c) => c.enabled ? p = p + 1 : p, 0)

const count = arr.reduce( (p, c) => p + r(c), 0) // Output: 4

如果你的[arr]有属性(比如count): 那么arr.reduce((p, c) => (c.prop.enabled ? p + +c.count : p), 0) - Mojtaba Pourmirzaei

1
这样的东西可以吗?
const arr =[[{ "enabled": true }], [{ "enabled": false}, {"enabled": true}]];               
const enabledArray = arr.map(function(item) {
    return item.filter(function(subItem){
        return subItem.enabled === true;
    })
})
const enabledItems = enabledArray.length;

1
你可以这样做:

const arr = [[{ "enabled": true }], [{ "enabled": false }, { "enabled": true }]];

console.log(
    arr.reduce(
    // Flatten the array of arrays
        (acc, curVal) => acc.concat(curVal), []         
    ).filter(
    // Filter so you have an array with 
    //       objects that have 'enable': true
        (obj) => Object.is(obj['enabled'], true))
    // and then return the length of it
    .length
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接