首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在对象数组中,按特定键对分组的值进行计数

在对象数组中,按特定键对分组的值进行计数
EN

Stack Overflow用户
提问于 2020-07-24 03:59:02
回答 3查看 85关注 0票数 2

我有以下数据:

代码语言:javascript
复制
const data2 = [
{
  App: "testa.com",
  Name: "TEST A",
  Category: "HR", 
  Employees: 7
},
{
  App: "testd.com",
  Name: "TEST D",
  Category: "DevOps", 
  Employees: 7
},
{
  App: "teste.com",
  Name: "TEST E",
  Category: "DevOps", 
  Employees: 7
},
{
  App: "testf.com",
  Name: "TEST F",
  Category: "Business", 
  Employees: 7
}
]

我想要获得不同类别的计数:现在我正在获得所有不同类别的列表,但我无法计算它们的计数。

下面的代码片段给出了不同的类别:

代码语言:javascript
复制
  let uniqueCategory = [];
  for(let i = 0; i < result.data.length; i++){    
      if(uniqueCategory.indexOf(result.data[i].Category) === -1){
        uniqueCategory.push(result.data[i].Category);        
      }        
  }

我应该做哪些更改才能在uniqueCategory中获得这些类别的计数-类似于以下内容:

代码语言:javascript
复制
uniqueCategory = [
  {Category: "DevOps", count: 5},
  {Category: "Business", count: 4},
  ....
  {}
]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-24 04:04:00

您的方法意味着在for(..-loop的每次迭代中循环您的源数组(使用.indexOf())。这将不必要地减慢查找过程。

相反,您可以使用Array.prototype.reduce()来遍历源数组并构建Map,将Category作为键,将所需格式的对象作为值,然后将Map.prototype.values()提取到结果数组中。

这将执行得更快,可伸缩性更好。

代码语言:javascript
复制
const src = [{App:"testa.com",Name:"TEST A",Category:"HR",Employees:7},{App:"testd.com",Name:"TEST D",Category:"DevOps",Employees:7},{App:"teste.com",Name:"TEST E",Category:"DevOps",Employees:7},{App:"testf.com",Name:"TEST F",Category:"Business",Employees:7}],

      result = [...src
        .reduce((r, {Category}) => {
          const cat = r.get(Category)
          cat ? cat.count ++ : r.set(Category, {Category, count: 1})
          return r
        }, new Map)
        .values()
      ]
    
console.log(result)
代码语言:javascript
复制
.as-console-wrapper{min-height:100%;}

票数 2
EN

Stack Overflow用户

发布于 2020-07-24 04:11:14

最简单的方法是使用Array.prototype.reduce

代码语言:javascript
复制
const arr = [ ... ];
const output = arr.reduce((result, obj) => {
  if (!result[obj.category]) {
    result[obj.category] = 0;
  }

  result[obj.category]++;

  return result;
}, {});
console.log(output); // this should log the similar output you want
票数 1
EN

Stack Overflow用户

发布于 2020-07-24 04:05:29

下面是使用.mapSet的另一种选择

代码语言:javascript
复制
const src = [
{
  App: "testa.com",
  Name: "TEST A",
  Category: "HR", 
  Employees: 7
},
{
  App: "testd.com",
  Name: "TEST D",
  Category: "DevOps", 
  Employees: 7
},
{
  App: "teste.com",
  Name: "TEST E",
  Category: "DevOps", 
  Employees: 7
},
{
  App: "testf.com",
  Name: "TEST F",
  Category: "Business", 
  Employees: 7
}
];

const categories = src.map(obj => obj.Category);
const distinctCategories = [...new Set(categories)];
console.log(distinctCategories.length);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63062228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档