Created
March 9, 2014 06:54
-
-
Save hontas/9443861 to your computer and use it in GitHub Desktop.
Recursively walk through tree-structure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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