如何在 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;
例如我有下面的树:
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;