Arrays 数组自下而上获取所有子项的总和

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

我有一个javascript数组,如下所示:

[
    {
        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!