lib for traversing trees and graphs


search through a complex object (nearly) as easily as forEach

all the nitty-gritty stuff is taken care of.


checking for repeats.

checking for cycles.

getting the path the the current object. etc!

#simple example# collect all branches in a tree.

var traverser = require('traverser')
  , branches = []

function branch(props){
  if(!props.reference) //since we check for references with will work in cyclic graphs, without stackoverflows.

  props.each()//continue working through the children of this object.

traverser([1,2,{},3,["x"]],{branch: branch})


#simple example2# collect all leaves in a tree. (only functions and primitives)

var traverser = require('traverser')

exports.leaves = leaves

function leaves (obj){
    var leaves = []

    function leaf(props){

    traverser(obj,{leaf: leaf})
    return leaves

traverser([1,2,{},3,["x"]],{leaf: leaves})


#complex example# even quite complex things like a topological sort are now achivable in ~30 lines. see traverser/examples/topo-sort


traverser (obj, options)

obj: graph/tree to traverse

options: (each of the following is optional)
  branch: function to call on a branch of the tree (by default, where typeof == 'object'
, leaf: function to call on primitives and functions
, isBranch: return true if current value should be treated as a branch

each function is passed one arg, a properties object which describes the state of the traverse.

  value: this object
, parent: object which this item is a property of. (null if your on the root object)
, key: key of this item on parent. (null if your on the root object)
, path: [list of keys from root object to current item]
, reference: true if this object is a repeat
, circular: true if this object is in the ancestors list.
, seen: list of objects seen so far
, ancestors: list of objects between value and root object.

//when your in the branch function, you need to call one of the following to iterate over the children.
//none of these require an argument.

, each: iterate over each property
, find: iterate untill the first truthy return, returns the item.
, map: collects return values into an Array
, copy: copies objects, preserving whether it's a {} or a []
, max: iterate over all properties and return max return value
, min: iterate over all properties and return min return value

###feel free to ask me questions if you need help!###

###see for more examples.###