首页 > 解决方案 > 通过将测试失败的树节点映射到其子节点来修剪树

问题描述

我的问题建立在我试图解决的另一个问题之上,并在我有一棵树的地方得到了一个很好的答案:

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.

标签: javascriptalgorithm

解决方案


您可以迭代数组并检查子节点是否完全选中,然后获取实际节点或仅获取一些子节点,然后仅获取子节点。

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; }


推荐阅读