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谢谢,我在末尾添加了一些小注释。