Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象数组中的数组计数_Javascript_Arrays - Fatal编程技术网

Javascript 对象数组中的数组计数

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;

假设我有一个对象数组,如下所示:

预期O/p:{alpha:4,beta:8}

为此,我尝试:

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你看到下面的答案了吗?它工作得很好。非常感谢。)