Javascript 从递归中获取总计

Javascript 从递归中获取总计,javascript,arrays,Javascript,Arrays,我有一个对象数组,它引用了它的集合 const数据=[{ id:1, 名称:‘A’, referer_id:null, 要点:4 }, { id:2, 名称:‘B’, 参考编号:1, 分数:100 }, { id:3, 名称:‘C’, referer_id:null, 要点:4 }, { id:4, 名称:“D”, 参考编号:1, 要点:2 }, { id:5, 名称:'E', referer_id:null, 要点:4 }, { id:6, 名称:“F”, referer_id:null, 要

我有一个对象数组,它引用了它的集合

const数据=[{
id:1,
名称:‘A’,
referer_id:null,
要点:4
},
{
id:2,
名称:‘B’,
参考编号:1,
分数:100
},
{
id:3,
名称:‘C’,
referer_id:null,
要点:4
},
{
id:4,
名称:“D”,
参考编号:1,
要点:2
},
{
id:5,
名称:'E',
referer_id:null,
要点:4
},
{
id:6,
名称:“F”,
referer_id:null,
要点:4
},
{
id:7,
名称:“G”,
参考编号:2,
要点:4
},
];
referer id将引用id。我有另一个用于计算点的数字数组

constpointsbylevel=[0.5,0.3,0.2];//这将是来自数据库的动态数据
到现在为止,我可以得到这样的总和

函数获取点(用户id){
const mainUserPoint=data.find((u)=>u.id==user\u id).point;
设和=0;
for(让data.filter的子dep((d)=>d.referer\u id==user\u id)){
sum+=getPoint(子部门id);
}
返回mainUserPoint+sum;
}
但真正的挑战是第一级应该只返回点,但之后该点将根据索引乘以
pointsByLevel

所以输出是这样的

console.log(getPoint(1));
/**
A-4
bd-[100*0.5],[2*0.5]
G-[4*0.3]
**/
// 4 + 50 + 1 + 1.2 = 56.2
所以最终结果我会得到56.2分


做这件事最有效的方法是什么?

作为
getPoint
的一个附加参数,您必须跟踪自己的深度。将默认值设置为0,并在每次递归时递增该值。然后,您可以按级别找到相应的点。(我为0级插入了1.0系数)。我还添加了一条注释,以显示每个级别的部分结果

const数据=[
{id:1,name:'A',referer_id:null,point:4},
{id:2,name'B',referer_id:1,point:100},
{id:3,name:'C',referer_id:null,point:4},
{id:4,名称:'D',参考id:1,点:2},
{id:5,name:'E',referer_id:null,point:4},
{id:6,name:'F',referer_id:null,point:4},
{id:7,名称:'G',参考id:2,点:4}
];
常量pointsByLevel=[1,0.5,0.3,0.2];//注意:我为0级添加了1.0
函数getPoint(用户id,级别=0){
const user=data.find((u)=>u.id==user\u id);
const mainUserPoint=user.point;
设和=0;
for(让data.filter的子dep((d)=>d.referer\u id==user\u id)){
设val=getPoint(subdep.id,级别+1);
sum+=val;
}
让结果=(mainUserPoint*pointsByLevel[level])+总和;
log(`getPoint for${user\u id}“${user.name}”的深度为${level}级,值为${result}`)
返回结果;
}

console.log(getPoint(1))这很好,但是有没有其他方法不必干预
pointsByLevel
当然。您可以用
(level?pointsByLevel[level-1]:1)替换
pointsByLevel[level]
,或者您可以索引
[1,…pointsByLevel][level]