i @ last stop of graph structure. supposed add callback each node. 2 things, 1. when call a.foreachnode(hasedge()) -> hasedge not function. 2. think code work? please explain if doing right or wrong. thanks
var graph = function(){ this.nodes = []; this.edges = {}; }; graph.prototype.addnode = function(node){ this.nodes.push(node); this.edges[node] = {}; }; graph.prototype.contains = function(node){ return this.nodes.indexof(node) !== -1; }; graph.prototype.removenode = function(node){ for(var key in this.edges){ if(key === node){ delete this.edges[node]; } } for(var = 0; < this.nodes.length; i++){ if(this.nodes[i] === node){ this.nodes.splice(i,1); } } }; graph.prototype.hasedge = function(fromnode, tonode){ for(var key in this.edges){ if(this.edges[fromnode][tonode]){ return true; } else { return false; } } }; graph.prototype.addedge = function(fromnode, tonode){ this.edges[fromnode][tonode] = true; this.edges[tonode][fromnode] = true; }; graph.prototype.removeedge = function(fromnode, tonode){ delete this.edges[fromnode][tonode]; delete this.edges[tonode][fromnode]; }; graph.prototype.foreachnode = function(cb){ //loop through edges object for(var key in this.edges){ //if keys exist if(keys){ //call on each nodes return cb(this.edges[key]); } } }; var = new graph(); a.addnode("puppies"); a.addnode("kittens"); a.addnode("bears"); a.addedge("puppies", "kittens"); a.addedge("puppies", "bears"); a.hasedge("puppies", "bears"); a.hasedge("kittens", "bears"); a.foreachnode(addedge());
your code looks good, except last part, you're trying pass addedge()
or hasendge()
.
hasedge()
- not defined because method of instance of graph. there should like
var g = new graph(); a.foreachnode(function(node){ g.addnode(node) });
it should add each nodes graph a
new graph g
===
upd imho better use more simple structure this:
graph { nodes: { node1: [node2, node3...] //achievable nodes node1 node2: [node5..] } }
so, think in case code simpler
function graph(){ this.nodes = {}; }; graph.prototype.addnode = function(nodename){ this.nodes[nodename] = []; return this; //for using method chaining graph.addnode(a).addnode(b).addnode(c)... }; graph.prototype.contains = function(node){ return this.nodes[node] !== undefined; }; graph.prototype.removenode = function(node){ delete this.nodes[node]; return this; }; graph.prototype.hasedge = function(fromnode, tonode){ //return this.nodes[fromnode].indexof(tonode) !== -1; return this.nodes[fromnode].includes(tonode); //better }; graph.prototype.addedge = function(fromnode, tonode){ //add node "tonode" if not exist if(this.nodes[tonode] === undefined){ this.addnode(tonode); } this.nodes[fromnode].push(tonode); return this; }; graph.prototype.removeedge = function(fromnode, tonode){ var index = this.nodes[fromnode].indexof(tonode); if(index !== -1){ this.nodes[fromnode].splice(index,1); } return this; }; graph.prototype.foreachnode = function(cb){ //loop through edges object for(var key in this.nodes){ cb(key, this.nodes[key]) } }; var = new graph(); a.addnode("puppies"); a.addnode("kittens"); a.addnode("bears"); a.addedge("puppies", "kittens"); a.addedge("puppies", "bears"); a.hasedge("puppies", "bears"); a.hasedge("kittens", "bears"); var g = new graph(); a.foreachnode(function(nodename, edges){ g.addnode(nodename); edges.foreach(function(edge){ g.addedge(nodename, edge); }); });