【问题标题】:Counting occurrences of particular property value in array of objects [duplicate]计算对象数组中特定属性值的出现次数[重复]
【发布时间】:2017-08-07 12:58:02
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 你有没有尝试过?
  • 我尝试这样做:for (let userData of json) { let newUserData = new UserData() newUserData.id = userData.personId; newUserData.name = this.personsService.getPersonBy(userData.personId).text, count = count + 1, newUserData.val = count, data.push(newUserData); } 但它只计算转入我的指令的次数......没有任何 id 的区别
  • 迭代并保留一个 id 的对象来计数?不确定是什么问题。或者,如果您只想要一个 id,只需检查 id 并在适当时增加计数器。没有比这更容易的了,顺便说一句。
  • 这是静态数据,还是在会话期间发生变化?

标签: javascript arrays


【解决方案1】:

一个简单的 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 作为suggested by @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);

【讨论】:

  • 我个人不会为此使用过滤器,因为您不需要新集合。最好手动迭代或通过内置和计数进行迭代。
  • 是的,我同意。我们正在生成一个我们并不真正需要的新数组。这肯定不是最佳解决方案。另一方面,如果数组永远不会很大,则性能差异是无关紧要的,因此拥有这样的单线可能会很有趣。
  • 我会像这样使用reduce:array.reduce((a, c) => c.id === id ? ++a : a, 0);
  • @YosvelQuintero 确实是更好的解决方案。
  • 看看这个 ES6 解决方案,如果数据是静态的,那么计数可以被缓存,或者如果数据是动态的,那么它也可以处理。 jsfiddle.net/Xotic750/j26s66m3
【解决方案2】:

你数数

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

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2016-03-19
    • 2019-09-29
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多