计算对象数组中特定属性值的出现次数(ANGULAR 2+)

moo*_*ine 8 javascript arrays

我想知道如何计算像这样一个对象数组的出现次数:

[
{id : 12,
 name : toto,
},
{id : 12,
 name : toto,
},
{id : 42,
 name : tutu,
},
{id : 12,
 name : toto,
},
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想有一个功能谁给我这个:

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

return occurs;
}
Run Code Online (Sandbox Code Playgroud)

如果我给id 12,我想有3.

我怎样才能做到这一点?

Alb*_*res 21

一个简单的ES6解决方案filter用于获取具有匹配id的元素,然后获取已过滤数组的长度:

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);
Run Code Online (Sandbox Code Playgroud)

编辑:另一个解决方案,更高效(因为它不生成新列表),是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);
Run Code Online (Sandbox Code Playgroud)

  • 我个人不会为此使用过滤器,因为您不需要新集合。最好手动迭代或通过内置和计数进行迭代。 (2认同)
  • 我会像这样使用`reduce`:`array.reduce((a,c)=> c.id === id?++ a:a,0);` (2认同)

ade*_*neo 6

你算

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) )
Run Code Online (Sandbox Code Playgroud)