javascript - 具有高阶函数的递归

标签 javascript recursion ecmascript-6

我想了解以下示例,因此对我来说非常清楚。不幸的是,我的头卡在了线上:.forEach (c => (node [c.id] = makeTree (categories, c.id)))。有人可以给我一个提示吗?

let categories = [
  { id: 'animals', parent: null },
  { id: 'mammals', parent: 'animals' },
  { id: 'cats', parent: 'mammals' },
  { id: 'dogs', parent: 'mammals' },
  { id: 'chihuahua', parent: 'dogs' },
  { id: 'labrador', parent: 'dogs' },
  { id: 'persian', parent: 'cats' },
  { id: 'siamese', parent: 'cats' }
];

let makeTree = (categories, parent) => {
  let node = {};
  categories
    .filter(c => c.parent == parent)
    .forEach(c => (node[c.id] = makeTree(categories, c.id)));
  return node;
};

console.log(makeTree(categories, null));

expected:

{
  animals: {
    mammals: {
      dogs: {
        chihuahua: null
        labrador: null
      },
      cats: {
        persian: null
        siamese: null
      }
    }
  }
}

最佳答案

代码可以等效地(并且,恕我直言,更简洁)用普通循环和条件而不是 filter 编写和 forEach :

function makeTree(categories, parent) {
  let node = {};
  for (const c of categories)
    if (c.parent == parent)
      node[c.id] = makeTree(categories, c.id);
  return node;
}

现在它只是一个普通的递归函数,没有高阶函数了。

另外,关于 forEach特别是回调,它使用了一个完全不必要的 grouping parenthesisshorthand arrow function syntax而不是用 block 体正确编写它(因为不需要从 forEach 回调返回任何内容):
.forEach(c => {
  node[c.id] = makeTree(categories, c.id);
});

关于javascript - 具有高阶函数的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58275042/

相关文章:

javascript - 从表单中写入所有偶数的函数

javascript - Jstree:当我重新加载我的树时,我无法将所有复选框重置为默认取消选中

python - 在python中查找具有约束的列表中的所有组合

c - 相同的程序给我不同的输出

javascript - 如何在 JavaScript 类中编写生成器?

javascript - 如何在我的 Mediaquery 中强制加载仅显示 JQuery 效果的类?

javascript - 如何在 jsFiddle 中添加来自 GitHub 的任意 javascript 文件?

java - 请再次帮助家庭作业。递归乘以偶数?

javascript - react : concatenate stateful objects to array

javascript - 这里如何使用扩展语法将数字转换为字符串数组?