Рассчитать количество объектов, используя сокращение или фильтр в javascript

Я написал метод для расчета количества объектов в массиве, для которых для параметра «enabled» установлено значение «true».

Я добавляю 1 к счетчику каждый раз, когда он находит в моем массиве объект, для которого 'enabled' установлено значение 'true'.

Как я мог добиться этого без использования переменной «счетчик» и вместо этого использовать сокращение или фильтр?

Вот мой код:

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 31.10.2018 14:00

да это правда, поправил сейчас! Я хочу использовать сокращение от ES6.

Sunny 31.10.2018 14:10
1
2
8 046
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Посмотрите ниже, я добавил комментарий:

[].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)

Или вы можете использовать сокращение, если хотите

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

Sunny 31.10.2018 14:11

Я добавил пример сокращения

StudioTime 31.10.2018 14:20

Хотелось бы, чтобы это сработало?

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;

Вы могли сделать:

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
);

На мой взгляд, использование вспомогательной функции 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

Другие вопросы по теме