从递归中获取total



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

const data = [{
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,
name: 'D',
referer_id: 1,
point: 2
},
{
id: 5,
name: 'E',
referer_id: null,
point: 4
},
{
id: 6,
name: 'F',
referer_id: null,
point: 4
},
{
id: 7,
name: 'G',
referer_id: 2,
point: 4
},
];

referer id将引用id。我有另一个用于计算点的数字数组

const pointsByLevel = [0.5, 0.3, 0.2]; // this would be dynamic from database

到目前为止,我可以得到所有总额的总和,就像这个

function getPoint(user_id) {
const mainUserPoint = data.find((u) => u.id === user_id).point;
let sum = 0;

for (let subdep of data.filter((d) => d.referer_id === user_id)) {
sum += getPoint(subdep.id);
}
return mainUserPoint + sum;
}

但真正的挑战是,第一级应该只返回该点,但之后该点将根据索引乘以pointsByLevel

所以输出会像这个

console.log(getPoint(1));
/**
A - 4
B D - [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 data = [
{ 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, name: 'D', referer_id: 1, point: 2 },
{ id: 5, name: 'E', referer_id: null, point: 4 },
{ id: 6, name: 'F', referer_id: null, point: 4 },
{ id: 7, name: 'G', referer_id: 2, point: 4 }
];
const pointsByLevel = [1, 0.5, 0.3, 0.2]; //  NOTE: I added a 1.0 for level 0
function getPoint(user_id, level = 0) {
const user = data.find((u) => u.id === user_id);
const mainUserPoint = user.point;
let sum = 0;
for (let subdep of data.filter((d) => d.referer_id === user_id)) {
let val = getPoint(subdep.id, level + 1);
sum += val;
}
let result = (mainUserPoint * pointsByLevel[level]) + sum;
console.log(`getPoint for ${user_id} "${user.name}" is ${level} levels deep and has the value ${result}`)
return result;
}
console.log(getPoint(1));

最新更新