[英]Pruning a tree by mapping nodes of tree that fail a test to its children
我在这里的问题建立在我试图解决的另一个问题上,并收到了关于我有一棵树的地方的很好的答案:
const treeData = [{
title: '0-0',
key: '0-0',
children: [{
title: '0-0-0',
key: '0-0-0',
children: [
{ title: '0-0-0-0', key: '0-0-0-0', children: [] },
{ title: '0-0-0-1', key: '0-0-0-1', children: [] },
{ title: '0-0-0-2', key: '0-0-0-2', children: [] },
],
}, {
title: '0-0-1',
key: '0-0-1',
children: [
{ title: '0-0-1-0', key: '0-0-1-0', children: [] },
{ title: '0-0-1-1', key: '0-0-1-1', children: [] },
{ title: '0-0-1-2', key: '0-0-1-2', children: [] },
],
}, {
title: '0-0-2',
key: '0-0-2',
children: []
}],
}, {
title: '0-1',
key: '0-1',
children: [
{ title: '0-1-0-0', key: '0-1-0-0', children: [] },
{ title: '0-1-0-1', key: '0-1-0-1', children: [] },
{ title: '0-1-0-2', key: '0-1-0-2', children: [] },
],
}, {
title: '0-2',
key: '0-2',
children: []
}];
和叶节点数组:
const leafNodes = ['0-0-1-2', '0-1-0-1', '0-1-0-2']
以前,我只想要一个包含所有叶节点路径的树的过滤/修剪副本,但现在我想通过删除不满足测试的父节点来进一步修剪它——测试正在它的所有子节点都包含在叶节点列表中。 生成的树将如下所示:
const pruned = [{
title: '0-0-1-2',
key: '0-0-1-2',
children: []
},
{
title: '0-1-0-1',
key: '0-1-0-1',
children: []
}, {
title: '0-1-0-2',
key: '0-1-0-2',
children: []
}
]
在这里,键为0-0-1
的节点将被删除,因为它的 3 个子节点( 0-0-1-2
)中只有一个包含在叶节点列表中,而子节点包含在叶节点列表中(在此情况下,只有一个)被提升到他们现在删除的父级的级别。 这将流回已删除节点的父节点,现在使用键0-0
,因为并非其所有子节点都包含在修剪树中。
同样的模式也适用于0-1
。
您可以迭代数组并检查子节点是否已完成选择,然后获取实际节点或仅获取一些子节点,然后仅获取子节点。
function getShort(array, keys) { var result = [], every = true; array.forEach(o => { var children; if (keys.includes(o.key)) return result.push(o); if (!o.children || !o.children.length) return every = false; children = getShort(o.children, keys); if (children.length && children.length === o.children.length) return result.push(o); result.push(...children); every = false; }); return every ? array : result; } const treeData = [{ key: '0-0', children: [{ key: '0-0-0', children: [{ key: '0-0-0-0', children: [] }, { key: '0-0-0-1', children: [] }, { key: '0-0-0-2', children: [] }] }, { key: '0-0-1', children: [{ key: '0-0-1-0', children: [] }, { key: '0-0-1-1', children: [] }, { key: '0-0-1-2', children: [] }] }, { key: '0-0-2', children: [] }] }, { key: '0-1', children: [{ key: '0-1-0-0', children: [] }, { key: '0-1-0-1', children: [] }, { key: '0-1-0-2', children: [] }] }, { key: '0-2', children: [] }], leafNodes = [ '0-0-0-0', '0-0-0-1', '0-0-0-2', // all 0-0-0 all 0-0 '0-0-1-0', '0-0-1-1', '0-0-1-2', // all 0-0-1 all 0-0 '0-0-2', // all 0-0-2 all 0-0 '0-1-0-1', '0-1-0-2' ], short = getShort(treeData, leafNodes); console.log(short);
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.