Arrays 数组自下而上获取所有子项的总和
我有一个javascript数组,如下所示:Arrays 数组自下而上获取所有子项的总和,arrays,algorithm,sum,hierarchical-data,Arrays,Algorithm,Sum,Hierarchical Data,我有一个javascript数组,如下所示: [ { used : 24000, service : service A, parent : service B, }, { used : 450, service : service B, parent : service C, }, ... ] 我想迭代数组以获得每个服务子级的总和。例如,如果一个服务将a和B
[
{
used : 24000,
service : service A,
parent : service B,
},
{
used : 450,
service : service B,
parent : service C,
},
...
]
我想迭代数组以获得每个服务子级的总和。例如,如果一个服务将a和B作为子项,那么它的used属性将是它自己的used+其子项used的总和。
因此,我需要首先获得层次结构中最深层的服务
然后,最终输出可以是:
[
{
used : 24000,
service : service A,
parent : service B,
},
{
used : 24450, //Sum here has changed
service : service B,
parent : service C,
},
...
]
最后一件事,顶级服务并不总是有空的父项
如果需要,我可以将数组转换为分层数组
有没有人有一个好的算法可以做到这一点(可能是javascript,但伪代码也很酷)?您可以使用
map
、reduce
和filter
在几行代码中完成:
var服务=[{
使用:24000,
服务:“A”,
家长:“B”,
}, {
使用:450,
服务:“B”,
家长:“C”,
}, {
使用:150,
服务:“C”,
}, {
使用:100,
服务:“D”
}
]
//更新一项服务,儿童优先
var\u update\u service\u sums=函数(服务,服务){
var children=services.filter(s=>s.parent==service.service)
forEach(c=>\更新\服务\和(c,服务))
service.used_sum=service.used+children.map(c=>c.used_sum).reduce((a,b)=>a+b,0);
}
//更新所有服务
var更新\服务\总和=功能(服务){
var root=services.filter(s=>s.parent==未定义)
forEach(r=>\更新\服务\和(r,服务))
}
更新服务总额(服务)
console.log(services)
这个问题让我想起了很多依赖关系的构建。在依赖项构建问题中,您必须根据作业的依赖项(必须在它们之前的作业)安排作业。如果您有作业A、B和C,其中A依赖于B和C,则必须在A之前安排作业B和C。您的问题似乎不是安排,而是将依赖作业中的数字添加到当前作业中。若要从服务A获取“已使用”总量,必须首先计算服务B和服务C的总量。您的数组是依赖关系图的表示形式,但不是调度作业,而是计算已使用属性
问题是,如果图形不是树,那么实现必须非常不同。从你对问题的描述来看,听起来我们在处理一棵树。如果我们没有,请在评论中告诉我,我可以更新我的答案。如果您将图形视为一个依赖关系树,那么您所需要做的就是确保,对于图形中的每个节点,您在对其求值之前先对其子节点求值。这可以通过使用后序遍历来完成。如果可以在此依赖关系图上实现后序遍历,则只需将左侧大小和右侧遍历返回的值添加到当前总数中,然后返回新的“users”属性供其父级使用。这是一个计算您的值的O(n)算法。看起来很棒,将根据我的代码进行调整,我将与您保持联系。谢谢:为适应我的代码做了一些更改,但它工作得很好。谢谢fafl!