javascript - Final step on my Graph Structure - forEachNode callback -


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);   });  });