Javascript:递归计算树中子项的数量

标签 javascript recursion

我们有一个 JSON 树结构,它维护特定节点的子节点。此子项参数是未定义的(没有子项)或数组。

我想计算一个节点的分数,它是子节点分数的总和。没有 child 的节点得分为 1。

这对我来说似乎很简单,但是只有叶节点中的最后一个节点被正确更新,其余的显示为 NaN。我不确定在哪里引入了 Undefined/NaN,我怀疑这可能是由于 JS 如何处理递归中的引用?

function updateScore(n) {
  if (n.children == undefined) return 1;
  n.children.forEach(function(c){
    var r = updateScore(c);  
    //if (!r) console.log(n);
    n.score += r;
  });
}
updateScore(sparent);

数据如下:

var sparent = {"id":"src","score":0,"children":[{"id":0,"score":0,"children":[{"id":14,"score":0}]},{"id":2,"score":0},{"id":4,"score":0},{"id":11,"score":0},{"id":17,"score":0,"children":[{"id":31,"score":0}]},{"id":18,"score":0},{"id":23,"score":0,"children":[{"id":13,"score":0,"children":[{"id":10,"score":0},{"id":21,"score":0,"children":[{"id":16,"score":0}]},{"id":82,"score":0,"children":[{"id":22,"score":0},{"id":75,"score":0}]},{"id":91,"score":0}]},{"id":48,"score":0,"children":[{"id":70,"score":0,"children":[{"id":46,"score":0},{"id":74,"score":0}]},{"id":97,"score":0,"children":[{"id":25,"score":0}]}]}]},{"id":28,"score":0,"children":[{"id":85,"score":0}]},{"id":30,"score":0,"children":[{"id":24,"score":0,"children":[{"id":26,"score":0},{"id":53,"score":0,"children":[{"id":45,"score":0}]},{"id":76,"score":0,"children":[{"id":38,"score":0},{"id":62,"score":0},{"id":66,"score":0}]},{"id":93,"score":0,"children":[{"id":1,"score":0},{"id":56,"score":0}]}]},{"id":78,"score":0,"children":[{"id":50,"score":0,"children":[{"id":15,"score":0},{"id":67,"score":0}]}]},{"id":94,"score":0}]},{"id":36,"score":0},{"id":39,"score":0,"children":[{"id":35,"score":0,"children":[{"id":73,"score":0},{"id":83,"score":0,"children":[{"id":3,"score":0}]}]}]},{"id":41,"score":0,"children":[{"id":5,"score":0},{"id":32,"score":0}]},{"id":43,"score":0,"children":[{"id":20,"score":0,"children":[{"id":89,"score":0,"children":[{"id":52,"score":0}]}]},{"id":27,"score":0},{"id":86,"score":0,"children":[{"id":6,"score":0}]},{"id":98,"score":0,"children":[{"id":54,"score":0},{"id":59,"score":0},{"id":65,"score":0,"children":[{"id":8,"score":0},{"id":47,"score":0}]},{"id":79,"score":0}]}]},{"id":64,"score":0},{"id":71,"score":0,"children":[{"id":19,"score":0},{"id":51,"score":0,"children":[{"id":57,"score":0,"children":[{"id":29,"score":0,"children":[{"id":49,"score":0}]},{"id":60,"score":0,"children":[{"id":34,"score":0}]}]},{"id":61,"score":0,"children":[{"id":63,"score":0},{"id":72,"score":0,"children":[{"id":9,"score":0},{"id":37,"score":0}]}]},{"id":90,"score":0}]},{"id":92,"score":0,"children":[{"id":96,"score":0,"children":[{"id":55,"score":0,"children":[{"id":12,"score":0},{"id":69,"score":0}]},{"id":80,"score":0}]}]}]},{"id":77,"score":0,"children":[{"id":81,"score":0,"children":[{"id":40,"score":0}]}]},{"id":84,"score":0,"children":[{"id":7,"score":0,"children":[{"id":33,"score":0,"children":[{"id":42,"score":0},{"id":95,"score":0}]}]},{"id":44,"score":0,"children":[{"id":58,"score":0}]}]},{"id":87,"score":0,"children":[{"id":68,"score":0}]},{"id":88,"score":0},{"id":99,"score":0}]};

最佳答案

如果元素有子元素,您忘记返回 score。试试这个:

function updateScore(n) {
  if (n.children == undefined) return 1;
  n.children.forEach(function(c){
    var r = updateScore(c);  
    //if (!r) console.log(n);
    n.score += r;
  });
  return n.score;
}

关于Javascript:递归计算树中子项的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22317671/

相关文章:

javascript - 禁用选择虚构日期

Java 字谜递归 List<List<String>> 仅存储空列表 <Strings>

javascript - 更改包含对象数组的对象中的属性名称

haskell - 为什么 foldl 尽管是尾递归的,但似乎是有害的?

javascript - Javascript 项目的 CIS

javascript - JQuery 无法在 Chrome 中运行?

javascript - HttpOnly cookie 不会从下一个 js getServerSideProps 使用 axios 发送(withCredentials : true)

javascript - 当 chrome 最小化时,使 Windows 任务栏上的 chrome 图标发光

c - 需要帮助创建没有多次返回的递归函数

c - C 递归中的魔法?谁能解释一下?