Javascript 如何计算数组中相同的对象属性值

Javascript 如何计算数组中相同的对象属性值,javascript,arrays,Javascript,Arrays,我有一个具有以下结构的大型阵列: let data = [ { name: 'name1', values: {...}, }, { name: 'name1', values: {...}, }, { name: 'name2', values: {...}, }, { name: 'name1', values: {...}, }, { name: 'name3', value

我有一个具有以下结构的大型阵列:

let data = [
  {
    name: 'name1',
    values: {...},
  },
  {
    name: 'name1',
    values: {...},
  },
  {
    name: 'name2',
    values: {...},
  },
  {
    name: 'name1',
    values: {...},
  },
  {
    name: 'name3',
    values: {...},
  },
  ...
]
我需要找到一种方法来计算每个名称在数据数组中作为名称值出现的频率

因此,在本例中,结果应类似于以下数组:

let nameCounts = [
  {
     name: 'name1'
     count: 3
  },
  {
     name: 'name2'
     count: 1
  },
  {
     name: 'name3'
     count: 1
  }
]

我正在努力找到解决这个问题的好办法。有什么想法吗?

使用
Array#reduce
Array#map
的替代解决方案

const data=[{name:'name1'},{name:'name1'},{name:'name2'},{name:'name1'},{name:'name3'}];
const q=data.reduce((s,{name})=>(s[name]=(s[name]|0)+1,s),{});
const r=Object.keys(q).map((key)=>({name:key,count:q[key]}));
控制台日志(r)您可以将数组添加到一个对象,该对象的名称作为键,“计数对象”作为值。然后,您可以使用以下工具获得最终阵列:

let数据=[{
名称:'name1',
值:{},
},
{
名称:'name1',
值:{},
},
{
名称:'name2',
值:{},
},
{
名称:'name1',
值:{},
},
{
名称:'name3',
值:{},
}
];
var res=Object.values(data.reduce((a,{name})=>{
a[name]=a[name]|{name,count:0};
a[name].count++;
返回a;
},Object.create(null));
控制台日志(res)
我将使用
名称
部分作为键创建一个对象,并让计数累积为该对象的值,然后使用将其转换回数组

const reducer = (acc, {name}) => {
    acc[name] = acc[name] || 0
    acc[name] += 1
    return acc
}

data.reduce(reducer, {})
    .entries()
    .forEach(([name, count]) => { name, count})

另一种方法是使用,因为
Map
是专门为此而设计的:)

let data=[{name:'name1',值:{},},{name:'name1',值:{},},{name:'name2',值:{},},{name:'name1',值:{},},{name:'name3',值:{},}];
常量countBy=(arr,prop)=>arr.reduce((r,c,i,a)=>{
r、 集合(c[prop],(r.get(c[prop])| | 0)+1)
返回i==a.length-1?
Array.from(r.map)([k,v])=>({name:k,count:v})):r
},新映射())

log(countBy(数据,'name'))
。。。也许对“| |”运算符的使用和
{name}
解构的一些注释有助于理解?次要说明:传递
Object.create(null)
而不是
{}
减少
作为安全的初始值<代码>对象。创建(空)
创建无原型对象。如果数组中的某个对象的名称类似于
name:“toString”
name:“valueOf”
。@ibrahimmahrir谢谢,我在末尾添加了一些小注释。