Javascript 创建计数等于子项的嵌套数组的更好方法';总计数

Javascript 创建计数等于子项的嵌套数组的更好方法';总计数,javascript,recursion,data-structures,Javascript,Recursion,Data Structures,我有输入数据结构,比如 const i=[ {时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:12}, {时间:“早餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:19}, {时间:“午餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:22}, {时间:“晚餐”,城市:“海得拉巴”,地区:“科蒂”,计数:10}, {时间:“晚餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:16}, {时间:“午餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:28}, {时间:“早餐

我有输入数据结构,比如

const i=[
{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:12},
{时间:“早餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:19},
{时间:“午餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:22},
{时间:“晚餐”,城市:“海得拉巴”,地区:“科蒂”,计数:10},
{时间:“晚餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:16},
{时间:“午餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:28},
{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:11},
{时间:“午餐”,城市:“海得拉巴”,地区:“科蒂”,计数:24},
{时间:“晚餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:27},
{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:22},
{时间:“早餐”,城市:“海得拉巴”,地区:“马尼康达”,计数:11},
{时间:“晚餐”,城市:“海得拉巴”,地区:“马尼孔达”,计数:10},
{时间:“午餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:17}
];
预期转换的数据结构应为嵌套数组,且
count
prop等于子级的
count
值之和

[
{
“d”:“早餐”,
“计数”:42,
“儿童”:[
{
“d”:“班加罗尔”,
“计数”:12,
“儿童”:[
{
“d”:“Bellandur”,
“计数”:12,
“儿童”:[]
}
]
},
{
“d”:“海得拉巴”,
“计数”:30,
“儿童”:[
{
“d”:“LBNagar”,
“计数”:19,
“儿童”:[]
},
{
“d”:“Manikonda”,
“计数”:11,
“儿童”:[]
}
]
}
]
},
{
“d”:“午餐”,
“计数”:91,
“儿童”:[
{
“d”:“班加罗尔”,
“计数”:39,
“儿童”:[
{
“d”:“Koramangala”,
“计数”:22,
“儿童”:[]
},
{
“d”:“Bellandur”,
“计数”:17,
“儿童”:[]
}
]
},
{
“d”:“海得拉巴”,
“计数”:52,
“儿童”:[
{
“d”:“LBNagar”,
“计数”:28,
“儿童”:[]
},
{
“d”:“科蒂”,
“计数”:24,
“儿童”:[]
}
]
}
]
},
{
“d”:“晚餐”,
“计数”:63,
“儿童”:[
{
“d”:“海得拉巴”,
“计数”:20,
“儿童”:[
{
“d”:“科蒂”,
“计数”:10,
“儿童”:[]
},
{
“d”:“Manikonda”,
“计数”:10,
“儿童”:[]
}
]
},
{
“d”:“班加罗尔”,
“计数”:43,
“儿童”:[
{
“d”:“Bellandur”,
“计数”:16,
“儿童”:[]
},
{
“d”:“Koramangala”,
“计数”:27,
“儿童”:[]
}
]
}
]
}
]
为了实现上述结果,我编写了一个代码片段

const输入=[
{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:12},
{时间:“早餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:19},
{时间:“午餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:22},
{时间:“晚餐”,城市:“海得拉巴”,地区:“科蒂”,计数:10},
{时间:“晚餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:16},
{时间:“午餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:28},
{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:11},
{时间:“午餐”,城市:“海得拉巴”,地区:“科蒂”,计数:24},
{时间:“晚餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:27},
{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:22},
{时间:“早餐”,城市:“海得拉巴”,地区:“马尼康达”,计数:11},
{时间:“晚餐”,城市:“海得拉巴”,地区:“马尼孔达”,计数:10},
{时间:“午餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:17}
];
//将嵌套数组转换为映射
//例如:{早餐:{班加罗尔:{贝兰多:40},}…}}
const nestedMap=input.reduce((acc,v)=>{
如果(!acc[v[“Time”]]){
acc[v[“时间”]={};
}
如果(!acc[v[“Time”]][v[“City”]]){
acc[v[“时间”][v[“城市”]={};
}
如果(!acc[v[“Time”]][v[“City”]][v[“Area”]])){
acc[v[“时间”][v[“城市”][v[“区域”]]=v[“计数”];
}
返回acc;
}, {});
const summer=(o,i)=>
o的类型==“编号”
? i+o
:对象值(o).减少((acc,v)=>acc+summer(v,i),0);
常量聚合器=o=>{
返回o的类型==“编号”
? []
:Object.entries(o.map)([n,child])=>({
d:n,
计数:夏季(儿童,0),
子项:聚合器(子项)
}));
};
const result=聚合器(nestedMap);

log(JSON.stringify(result,未定义,2))您可以采用一种更简洁的方法,使用嵌套键数组,并搜索具有级别值的对象

然后添加count并返回实际对象

这种方法可以防止跟踪子数组

var数据=[{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:12},{时间:“早餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:19},{时间:“午餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:22},{时间:“晚餐”,城市:“科蒂”,计数:10},{时间:“晚餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:16},{时间:“午餐”,城市:“海得拉巴”,地区:“埃尔纳加尔”,计数:28},{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,计数:11},{时间:“午餐”,城市:“海得拉巴”,地区:“科蒂”,计数:24},{时间:“晚餐”,城市:“班加罗尔”,地区:“科拉曼加拉”,计数:27},{时间:“早餐”,城市:“班加罗尔”,地区:“贝兰多”,伯爵:22},{时间:“早餐”,城市:“海得拉巴”