javascript - 通过将测试失败的树节点映射到其子节点来修剪树
问题描述
我的问题建立在我试图解决的另一个问题之上,并在我有一棵树的地方得到了一个很好的答案:
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
(他们现在被移除的父母。这将流回到已删除节点的父节点,现在使用 key 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; }
推荐阅读
- reactjs - 在 ReactJS PWA 中扫描信用卡信息
- java - org.json.JSONException: JSONObject["userId"] 未找到。.JSONException
- mongodb - Amazon DynamoDB 在网络分区期间选择一致性。亚马逊文档数据库有什么作用?
- arrays - 如何取 2 列,一列用于名称,一列用于值,并吐出每个唯一名称的唯一数量?然后列个清单
- javascript - Highcharts 股票图表未显示自定义数据
- visual-studio-2019 - 如何在 Visual Studio 2019 中更改分析文件输出位置?
- python - 连接的位于基本路径组件之外
- arrays - 将 c 中的值交换为反向数组,但数组/内存块保持不变
- tensorflow - Keras Tuner 和 keras 功能 API
- reactjs - 有没有办法从 tomcat 读取属性文件进行反应?