【问题标题】:Filter hierarchy to only leaf level nodes将层次结构过滤到仅叶级节点
【发布时间】:2018-03-28 15:09:45
【问题描述】:

我正在尝试过滤给定叶级节点列表的层次结构。为了解释有点苦涩,我附上了一张图片。

给定一个层次结构,并给定如图左侧所示的叶级节点列表,过滤层次结构以仅显示叶级节点及其各自返回根的路径。

数据如下:

[{"NodeId":"1","id":"1","dimension":"Hierarchy Number","name":"root","children":[{"NodeId":"1.1","id":"1.1","dimension":"Hierarchy Number","name":"1.1","parent":"1","children":[{"NodeId":"1.1.1","id":"1.1.1","dimension":"Hierarchy Number","name":"1.1.1","parent":"1.1"},{"NodeId":"1.1.2","id":"1.1.2","dimension":"Hierarchy Number","name":"1.1.2","parent":"1.1"},{"NodeId":"1.1.3","id":"1.1.3","dimension":"Hierarchy Number","name":"1.1.3","parent":"1.1"}]},{"NodeId":"1.2","id":"1.2","dimension":"Hierarchy Number","name":"1.2","parent":"1","children":[{"NodeId":"1.2.1","id":"1.2.1","dimension":"Hierarchy Number","name":"1.2.1","parent":"1.2"},{"NodeId":"1.2.2","id":"1.2.2","dimension":"Hierarchy Number","name":"1.2.2","parent":"1.2","children":[{"NodeId":"1.2.2.1","id":"1.2.2.1","dimension":"Hierarchy Number","name":"1.2.2.1","parent":"1.2.2"},{"NodeId":"1.2.2.2","id":"1.2.2.2","dimension":"Hierarchy Number","name":"1.2.2.2","parent":"1.2.2"}]}]}]}]

每个子节点也有一个指向其内部父节点的引用(除了这个根节点)

【问题讨论】:

  • 1.1.31.2.1 是什么?你有更多的数据来反映图片中给定的结构吗?你试过什么吗?
  • The data looks like so: 是吗?抱歉,之前在 Javascript 中没有见过这种数据结构。
  • 我已经编辑了数据部分以反映实际的数据结构@Keith,
  • @NinaScholz 1.1.3 和 1.2.1 是原始树的一部分,一旦它们将被过滤掉,因为它们不是通过返回给定叶节点创建的树的一部分

标签: javascript filter tree hierarchy


【解决方案1】:

您可以通过改变子属性来过滤数组。

如果您不需要改变数组,则需要在迭代时获取树的副本或构建新对象。

function filter(root, leafs) {
    return root.filter(function (node) {
        var temp;
        if (leafs.includes(node.NodeId)) {
            return true;
        }
        temp = filter(node.children || [], leafs);
        if (temp.length) {
            node.children = temp;
            return true;
        }
    });
}

var tree = [{ NodeId: "1", id: "1", dimension: "Hierarchy Number", name: "root", children: [{ NodeId: "1.1", id: "1.1", dimension: "Hierarchy Number", name: "1.1", parent: "1", children: [{ NodeId: "1.1.1", id: "1.1.1", dimension: "Hierarchy Number", name: "1.1.1", parent: "1.1" }, { NodeId: "1.1.2", id: "1.1.2", dimension: "Hierarchy Number", name: "1.1.2", parent: "1.1" }, { NodeId: "1.1.3", id: "1.1.3", dimension: "Hierarchy Number", name: "1.1.3", parent: "1.1" }] }, { NodeId: "1.2", id: "1.2", dimension: "Hierarchy Number", name: "1.2", parent: "1", children: [{ NodeId: "1.2.1", id: "1.2.1", dimension: "Hierarchy Number", name: "1.2.1", parent: "1.2" }, { NodeId: "1.2.2", id: "1.2.2", dimension: "Hierarchy Number", name: "1.2.2", parent: "1.2", children: [{ NodeId: "1.2.2.1", id: "1.2.2.1", dimension: "Hierarchy Number", name: "1.2.2.1", parent: "1.2.2" }, { NodeId: "1.2.2.2", id: "1.2.2.2", dimension: "Hierarchy Number", name: "1.2.2.2", parent: "1.2.2" }] }] }] }];

console.log(filter(tree, ['1.1.1', '1.1.2', '1.2.2.1', '1.2.2.2']));
.as-console-wrapper { max-height: 100% !important; top: 0; }

不改变原始树。

function filter(root, leafs) {
    var result = [];
    root.forEach(function (node) {
        var children;
        if (leafs.includes(node.NodeId)) {
            result.push(node);
            return;
        }
        children = filter(node.children || [], leafs);
        if (children.length) {
            result.push(Object.assign({}, node, { children }));
        }
    });
    return result;
}

var tree = [{ NodeId: "1", id: "1", dimension: "Hierarchy Number", name: "root", children: [{ NodeId: "1.1", id: "1.1", dimension: "Hierarchy Number", name: "1.1", parent: "1", children: [{ NodeId: "1.1.1", id: "1.1.1", dimension: "Hierarchy Number", name: "1.1.1", parent: "1.1" }, { NodeId: "1.1.2", id: "1.1.2", dimension: "Hierarchy Number", name: "1.1.2", parent: "1.1" }, { NodeId: "1.1.3", id: "1.1.3", dimension: "Hierarchy Number", name: "1.1.3", parent: "1.1" }] }, { NodeId: "1.2", id: "1.2", dimension: "Hierarchy Number", name: "1.2", parent: "1", children: [{ NodeId: "1.2.1", id: "1.2.1", dimension: "Hierarchy Number", name: "1.2.1", parent: "1.2" }, { NodeId: "1.2.2", id: "1.2.2", dimension: "Hierarchy Number", name: "1.2.2", parent: "1.2", children: [{ NodeId: "1.2.2.1", id: "1.2.2.1", dimension: "Hierarchy Number", name: "1.2.2.1", parent: "1.2.2" }, { NodeId: "1.2.2.2", id: "1.2.2.2", dimension: "Hierarchy Number", name: "1.2.2.2", parent: "1.2.2" }] }] }] }];

console.log(filter(tree, ['1.1.1', '1.1.2', '1.2.2.1', '1.2.2.2']));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 2018-01-04
  • 2014-03-28
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2010-09-17
相关资源
最近更新 更多