gpt4 book ai didi

javascript - 通过将未通过测试的树节点映射到其子节点来 trim 树

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:32 26 4
gpt4 key购买 nike

我的问题基于 another problem I was trying to solve and received an excellent answer for我有一棵树的地方:

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']

之前,我只想要一个包含所有到叶节点路径的树的过滤/trim 副本,但现在我想通过删除不满足测试的父节点来进一步 trim 它——测试将其所有子节点都包含在叶节点列表中。生成的树看起来像这样:

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) 中只包含其中一个在 leafNodes 列表中,叶节点列表中包含的子节点(在这种情况下,只有一个)被提升到它们现在已删除的父节点的级别。这将回流到已删除节点的父节点,现在使用键 0-0,因为并非所有它的子节点都包含在 trim 后的树中。

同样的模式也适用于 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; }

关于javascript - 通过将未通过测试的树节点映射到其子节点来 trim 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55169988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com