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]