我有一个数组树
[
'-',
[
'+',
[
'*',
2,
3
],
4
],
3
]
因此每个级别由一个运算符和两个操作数组成。每个操作数可以是操作数本身,也可以是包含运算符和2个操作数的另一个数组。
我需要绘制一个图形,所以我必须从这个树创建节点和边缘。
我已经让它在cytoscape中工作了
function walk(arr, prevRootNode) {
var rootNode = cy.add({
group: 'nodes',
data: {
name: arr[0]
}
});
if (prevRootNode) {
cy.add({
group: 'edges',
data: {
source: prevRootNode.id(),
target: rootNode.id()
}
});
}
if (Array.isArray(arr[1])) {
walk(arr[1], rootNode);
} else {
var child1Node = cy.add({
group: 'nodes',
data: {
name: arr[1]
}
});
var child1Edge = cy.add({
group: 'edges',
data: {
source: rootNode.id(),
target: child1Node.id()
}
});
}
if (Array.isArray(arr[2])) {
walk(arr[2], rootNode);
} else {
var child2Node = cy.add({
group: 'nodes',
data: {
name: arr[2]
}
});
var child2Edge = cy.add({
group: 'edges',
data: {
source: rootNode.id(),
target: child2Node.id()
}
});
}
}
walk(ast);
但代码难以阅读,我宁愿使数据独立于cytoscape,所以我想要一个节点数组和一个边数组,每个边应该有两个字段source
和{{1它保存了边连接在一起的节点的id。