计算对象数组中特定属性值的出现次数

IT技术 javascript arrays
2021-03-14 10:34:58

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

[
{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。

我怎样才能做到这一点?

2个回答

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

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

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

console.log(count);

编辑:另一种解决方案,即更有效(因为它不产生一个新的数组),是使用reduce作为由@YosvelQuintero建议

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

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

console.log(count);

是的,我同意。我们正在生成一个新数组,其中包含我们并不真正需要的项目。这肯定不是最佳解决方案。另一方面,如果数组从不很大,则性能差异无关紧要,因此拥有这样的单行代码可能会很有趣。
2021-04-23 10:34:58
我会这样使用reducearray.reduce((a, c) => c.id === id ? ++a : a, 0);
2021-05-08 10:34:58
我个人不会为此使用过滤器,因为您不需要新集合。最好手动迭代或通过内置和计数进行迭代。
2021-05-11 10:34:58
看看这个 ES6 解决方案,如果数据是静态的,那么计数可以被缓存,或者如果数据是动态的,那么它也会处理它。jsfiddle.net/Xotic750/j26s66m3
2021-05-13 10:34:58
@YosvelQuintero 这确实是一个更好的解决方案。
2021-05-14 10:34:58

你算

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