Подсчет вхождений определенного значения свойства в массиве объектов

1

Я хотел бы знать, как я могу подсчитать количество вхождений в массиве объектов, подобных этому:

[
{id : 12,
 name : toto,
},
{id : 12,
 name : toto,
},
{id : 42,
 name : tutu,
},
{id : 12,
 name : toto,
},
]

в этом случае я хотел бы иметь функцию, которая дает мне это:

getNbOccur(id){
//don't know...//

return occurs;
}

и если я дам id 12, я бы хотел иметь 3.

Как я могу это сделать?

  • 1
    Вы пробовали что-нибудь?
  • 0
    я попытался сделать это: для (пусть userData из json) {пусть newUserData = new UserData () newUserData.id = userData.personId; newUserData.name = this.personsService.getPersonBy (userData.personId) .text, count = count + 1, newUserData.val = count, data.push (newUserData); } но он только подсчитывает количество поворотов в my для инструкции ... Без всяких ограничений id
Показать ещё 2 комментария
Теги:
arrays

2 ответа

6
Лучший ответ

Простое решение ES6 использует filter чтобы получить элементы с совпадающим идентификатором, а затем получить длину фильтрованного массива:

var array = [{
        id: 12,
        name: 'toto',
    },
    {
        id: 12,
        name: 'toto',
    },
    {
        id: 42,
        name: 'tutu',
    },
    {
        id: 12,
        name: 'toto',
    },
];

var id = 12;
var count = array.filter((obj) => obj.id === id).length;

console.log(count);

Изменить: другое решение, более эффективное (поскольку оно не генерирует новый список), является использование reduce как предлагается @YosvelQuintero:

var array = [{
        id: 12,
        name: 'toto',
    },
    {
        id: 12,
        name: 'toto',
    },
    {
        id: 42,
        name: 'tutu',
    },
    {
        id: 12,
        name: 'toto',
    },
];

var id = 12;
var count = array.reduce((acc, cur) => cur.id === id ? ++acc : acc, 0);

console.log(count);
  • 0
    Лично я бы не использовал фильтр для этого, так как вам не нужна новая коллекция. Лучше либо итерировать вручную или через встроенный и считать.
  • 0
    Ага, я согласен. Мы генерируем новый массив, элементы которого нам на самом деле не нужны. Это не оптимальное решение наверняка. Если массив никогда не бывает большим, с другой стороны, разница в производительности несущественна, поэтому может быть интересно иметь такую строчку, как эта.
Показать ещё 5 комментариев
1

Вы считаете

var arr = [
  {id: 12, name: 'toto'},
  {id: 12, name: 'toto'},
  {id: 42, name: 'tutu'},
  {id: 12, name: 'toto'}
]

function getNbOccur(id, arr) {
  var occurs = 0;
  
  for (var i=0; i<arr.length; i++) {
    if ( 'id' in arr[i] && arr[i].id === id ) occurs++;
  }

  return occurs;
}

console.log( getNbOccur(12, arr) )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню