Skip to content

Instantly share code, notes, and snippets.

@hontas
Created March 9, 2014 06:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hontas/9443861 to your computer and use it in GitHub Desktop.
Save hontas/9443861 to your computer and use it in GitHub Desktop.
Recursively walk through tree-structure
// node { id: [Number], nodeTypeId: [String] }
// edge { fromNodeId: [Number], toNodeId: [Number], fromPort: [String] }
var decisionTree = {
nodes: [],
edges: [],
getTreeMatrix: function() {
var start = this.nodes.findBy('nodeTypeId', 'StartNode'),
self = this;
function getEdgesFor(node) {
return self.edges.filterBy('fromNodeId', node.id);
}
function getNodeById(id) {
return self.nodes.findBy('id', id);
}
function getStraightEdge(edges) {
return (edges.length > 1) ? edges.findBy('fromPort', 'then') : edges[0];
}
function getNext(node) {
var edges = getEdgesFor(node);
if (edges.length) {
var edge = getStraightEdge(edges);
return getNodeById(edge.toNodeId);
}
}
function hasElseNodes(node) {
return getEdgesFor(node).length > 1;
}
function getNextElse(node) {
var edge = getEdgesFor(node).findBy('fromPort', 'else');
return getNodeById(edge.toNodeId);
}
function getTreeFrom(node) {
if (!node) { return []; }
if (hasElseNodes(node)) {
node.elseNodes = getTreeFrom(getNextElse(node));
}
return [node].concat(getTreeFrom(getNext(node)));
}
return getTreeFrom(start);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment