猿问

从递归中得到总数

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


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


最有效的方法是什么


慕工程0101907
浏览 196回答 1
1回答

皈依舞

作为 的附加参数,您必须跟踪您的深度级别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 0function 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));
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答