【问题标题】:gojs - Find node levelgojs - 查找节点级别
【发布时间】:2021-05-07 14:18:21
【问题描述】:

我有一个 GoJS 画布,用户根据自己的意愿在其中创建,应用程序需要按顺序处理节点。

所以根据 GoJS 文档,有 gojsNodeObject.findTreeLevel(),它返回图中节点的级别。
到目前为止它工作得很好,但最近它引起了一个问题。

请在小提琴http://jsfiddle.net/2pqretgu/1/看我下面的图表

根据逻辑,它将序列返回给我
["s1", "s2", "s3", "s4", "i1", "i2", "i3", "j1", "j2", "j3", "i4", "j4"]

但我希望序列是
i1 应该在 j1 之前
j1 应该在 i2 和 i3 之前
i2 和 i3 应该在 j2 和 j3 之前
j4 应该是最后一个

简而言之,我是根据分层布局创建的层执行节点,但我不能依赖布局来找到它的位置,因为用户可以更改布局。

任何帮助或指点将不胜感激

【问题讨论】:

    标签: javascript gojs


    【解决方案1】:

    在我看来,如果库的实现不适合你,最好自己实现逻辑。

    这正是我所做的,看看这个小提琴:https://jsfiddle.net/Ba2siK/8megtv0k/

    我将节点映射到一个图中,然后递归遍历该图以计算每个节点的深度。 输出为:["s1", "s2", "i1", "j1", "s3", "s4", "i2", "i3", "j2", "j3", "i4", "j4"]

    // Create an object that maps each node to its children
    const graph = {};
    myDiagram.nodes.each(node => {
        graph[node.data.key] = flattenIterator(node.findNodesOutOf());
    });
    
    const nodesLevels = getNodesLevels(myDiagram);
    const sortedLevelsInfo = Object.keys(nodesLevels).sort((a, b) => nodesLevels[a] - nodesLevels[b]);
    
    console.log(nodesLevels);
    console.log(sortedLevelsInfo);
    // Output: ["s1", "s2", "i1", "j1", "s3", "s4", "i2", "i3", "j2", "j3", "i4", "j4"]
    
    // Convert an iterator to an array, to make the code more readable
    function flattenIterator(collection) {
        const items = [];
        var it = collection.iterator;
        while (it.next()) {
            items.push(it.value);
        }
    
        return items;
    }
    
    function getNodesLevels(diagram) {
        const treeLevels = {};
    
        var nodeIterator = diagram.nodes.iterator;
        while (nodeIterator.next()) {
            findNodeLevel(graph, nodeIterator.value, treeLevels);
        }
    
        const maxLevel = Math.max(...Object.values(treeLevels));
        // Reversing the order of node depths, since deepest node starts from 0
        Object.keys(treeLevels).map((key, index) => {
            treeLevels[key] = maxLevel - treeLevels[key];
        });
        return treeLevels;
    }
    
    function findNodeLevel(graph, node, levels) {
        const key = node.data.key;
    
        if (!Object.keys(levels).includes(key)) {
            const child = graph[key];
            if (!child) {
                levels[key] = 0
            } else {
                if (child.length) {
                    const childrenLevels = child.map(child => findNodeLevel(graph, child, levels) + 1);
                    levels[key] = Math.max(...childrenLevels);
                } else {
                    levels[key] = 0;
                }
            }
        }
    
        return levels[key];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      相关资源
      最近更新 更多