Skip to content
This repository has been archived by the owner on Dec 5, 2019. It is now read-only.
/ traverser Public archive

do complex traversals of arbitrary trees

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE.APACHE2
MIT
LICENSE.MIT
Notifications You must be signed in to change notification settings

dominictarr/traverser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#Traverser#

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

all the nitty-gritty stuff is taken care of.

including:

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.
    branches.push(props.value)

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

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

console.log(branches)

#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){
      leaves.push(props.value)
    }

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

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

console.log(leaves([1,2,{},3,["x"]]))
//[1,2,3,'x']

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

#API#

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 https://github.com/dominictarr/trees for more examples.###

##License

Mit/Apache2

About

do complex traversals of arbitrary trees

Resources

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE.APACHE2
MIT
LICENSE.MIT

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published