如何在 javascript 中最有效地对规范化数据进行反规范化

How to denormalize normalized data most effectively in javascript

例如我有下面的树:

root: {
  a: {
    b: null,
    c: {
      d: null
    }
  }
  e: null
}

我收到的形状是{ [child]: parent }:

{
  a: 'root',
  e: 'root',
  b: 'a',
  c: 'a',
  d: 'c'
}

但我没有收到如上订购的商品。不过,我愿意。

如果我知道根项目(没有 parent)是 root,我可以使用这个函数:

const recurs = (obj, cb, parent = 'root') => Object.entries(obj)
  .filter(([child, childsParent]) => childsParent === parent)
  .forEach(([child]) => {
    cb(child);
    recurs(obj, cb, child);
  });

但是因为它是递归的,所以它可以填满内存,因为 parent 在一切完成之前不会被垃圾回收。有没有更有效的方法来做这类事情?这可以转换为 for 循环吗?

使用在单个线性循环中填充的查找 table:

const edges = {
  a: 'root',
  e: 'root',
  b: 'a',
  c: 'a',
  d: 'c'
};

const forest = {};
for (const child in edges) {
  const parent = edges[child];
  forest[parent] ??= {};
  forest[child] ??= {};
  forest[parent][child] = forest[child];
}
const tree = forest.root;