首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gojs -查找节点级别

gojs -查找节点级别
EN

Stack Overflow用户
提问于 2021-05-07 14:18:21
回答 1查看 164关注 0票数 3

我有一个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应该是最后一个

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

如有任何帮助或指点,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2022-01-28 15:01:11

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

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

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

代码语言:javascript
复制
// 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];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67436655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档