Javascript 对象数组中的数组计数
假设我有一个对象数组,如下所示: 预期O/p:{alpha:4,beta:8} 为此,我尝试:Javascript 对象数组中的数组计数,javascript,arrays,Javascript,Arrays,假设我有一个对象数组,如下所示: 预期O/p:{alpha:4,beta:8} 为此,我尝试: const苹果=[{ 名称:“alpha”, 详情:[{ “附件”:[123456] }, { “附件”:[14541992] }] }, { 名称:“beta”, 详情:[{ “附件”:[“12”,189] }, { “附件”:[“maggi”,1890年,2000年] }, { “附件”:[1990、2001、2901] }] } ]; 常量AppledDetails=[]; for(设i=0;
const苹果=[{
名称:“alpha”,
详情:[{
“附件”:[123456]
}, {
“附件”:[14541992]
}]
},
{
名称:“beta”,
详情:[{
“附件”:[“12”,189]
}, {
“附件”:[“maggi”,1890年,2000年]
}, {
“附件”:[1990、2001、2901]
}]
}
];
常量AppledDetails=[];
for(设i=0;i {
附件.forEach((附件)=>{
应用数据推送({
名称
_id:attatchId
})
})
})
const eachAppleCount=应用数据减少((会计科目,项目)=>{
const key=item.name
如果(!acc.hasOwnProperty(键)){
acc[键]=0
}
acc[键]+=1
返回acc
}, {})
console.log(eachappelcount)代码>这将完成工作
const苹果=[{
名称:“alpha”,
详情:[{
“附件”:[123456]
}, {
“附件”:[14541992]
}]
}, {
名称:“beta”,
详情:[{
“附件”:[“12”,189]
}, {
“附件”:[“maggi”,1890年,2000年]
}, {
“附件”:[1990、2001、2901]
}]
}];
const result=apple.reduce((acc,curr)=>{
如果(科目[当前名称]==未定义)科目[当前名称]=0;
当前详细信息.forEach((d)=>(acc[curr.name]+=d.attachment.length));
返回acc;
}, {});
控制台日志(结果)代码>试试下面的方法
- -map()方法创建一个新数组,其中填充了对调用数组中的每个元素调用提供函数的结果
- 将新对象创建为
{[a.name]:values}
在[]
中使用[a.name]
的位置,因此a.name
中的值将设置为对象键
- 为了获得值,我们使用-flatMap()方法返回一个新数组,该数组是通过对数组的每个元素应用给定的回调函数,然后将结果展平一级而形成的
- 使用
a.details.flatMap(d=>d.attachment)
获取所有附件,并使用.length
获取总计数作为值
map
将以对象数组的格式返回结果
- 与一起使用可将对象数组合并为单个对象
const苹果=[
{姓名:'alpha',详情:[{“附件”:[123456]},{“附件”:[14541992]},
{名称:'beta',详情:[{“附件”:[“12”,189]},{“附件”:[“maggi”,18902000]},{“附件”:[1990,20012901]}]
];
//映射将以对象数组的格式返回结果
让resultArr=apple.map(a=>({[a.name]:a.details.flatMap(d=>d.attachment.length}));
//使用reduce with spread语法(…)将对象数组合并到单个对象中。
让result=resultArr.reduce((i,a)=>({…a,…i}),{});
控制台日志(结果)代码>对于下面的输入,每个苹果名称的答案不会是唯一的(你将有两个我认为不好的alpha-apple条目):const-apple=[{name:'alpha',details:[{attachment:[123456]},{attachment:[14541992]},{name:'alpha',details:[{attachment:[123456222]},{attachment:[14541992]},{name:'beta',详细信息:[{附件:['12',189]},{附件:['maggi',1890,2000]},{附件:[1990,2001,2901]},{附件:[1990,2001,2901]},],},]
@LiorKaminsky,是的,你是对的。如果OP可以为alpha
提供多个条目,那么他最好使用你提供的解决方案。输出似乎与OP期望的不同。这将为每个和创建一个对象并返回一个数组。OP期望一个对象,名称为key,计数为values.@VLAZ,谢谢你指出这一点。更新了答案。我个人不太喜欢用reduce()
不断地传播对象。我可能会制作resultar
一个成对数组,然后在上面使用Object.fromEntries()
:另一种选择是用当前代码调用resultar.reduce((i,a)=>Object.assign(i,a),{}
Siva Pradhan你看到下面的答案了吗?它工作得很好。非常感谢。)