我想解析一个String(预订树遍历的序列化)到JSON对象(树的节点和边缘)。
问题
如何提取节点之间的边缘?
字符串表示
String包含节点和节点(边缘)之间的依赖关系。
前进符号将是一个简单的'>'并且空(或反向一级)符号将是一个简单的'<'字符。
示例:
'1>2>5<6<<3>4>7(<<<<)'
提取元素
为了提取元素(节点,边),我使用正则表达式预处理String。
var network_info = '1>2>5<6<<3>4>7(<<<<)';
var network_elements = network_info.replace(/(\(<*\))/,'').match(/<|>|[0-9]/g);
结果是
Array [ "1", ">", "2", ">", "5", "<", "6", "<", "<", "3", ">", "4", ">", "7"]
提取节点
为了提取节点,我定义了函数“getNodes”。
function getNodes(network_elements) {
var nodes = [];
var node_id = 1;
for (var i = 0; i < network_elements.length; i++) {
if(network_elements[i] != '<' && network_elements[i] != '>') {
var node = {};
node.id = node_id++;
node.label = network_elements[i];
nodes.push(node);
}
}
return nodes;
}
结果是包含节点的id和标签的JSON对象的列表
[
{id: 1, label: '1'},
{id: 2, label: '2'},
{id: 3, label: '5'},
{id: 4, label: '6'},
...]
问题:边缘
边缘的结果应如下所示(from和to表示相应节点的id。
[
{id: 1, from: 1, to: 2},
{id: 2, from: 2, to: 3},
{id: 3, from: 2, to: 4},
{id: 4, from: 1, to: 5},
{id: 5, from: 5, to: 6},
{id: 6, from: 6, to: 7}
]
伪代码示例
var edges = [];
var edge_id = 1;
var from_node_id = 1;
var to_node_id = 2;
LOOP:
GET from_node_id
var edge = {};
edge.id = edge_id++;
edge.from = from_node_id;
edge.to = to_node_id++;
edges.push(edge);
树结果
字符串'1&gt; 2&gt; 5&lt; 6&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&gt;
非常感谢任何帮助。
非常感谢-tao
答案 0 :(得分:0)
您可以使用一堆节点来跟踪根目录的当前路径。推送堆栈上的初始节点。然后,当您看到>X
时,将当前堆栈顶部的左边缘添加到节点X
并在堆栈上推送X
。当您看到<...< Y
时,为每个<
在堆栈中弹出一个节点,然后从堆栈顶部添加一个新的右边缘到Y
。
您似乎对JSON详细信息没有任何问题。我会让那些让你锻炼的。