Nocturnal Prancing Mosquito
    Have ideas to improve npm?Join in the discussion! »

    traverse
    DefinitelyTyped icon, indicating that this package has TypeScript declarations provided by the separate @types/traverse package

    0.5.2 • Public • Published

    traverse

    Traverse and transform objects by visiting every node on a recursive walk.

    examples

    transform negative numbers in-place

    negative.js

    var traverse = require('traverse');
    var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ];
     
    traverse(obj).forEach(function (x) {
        if (< 0) this.update(+ 128);
    });
     
    console.dir(obj);

    Output:

    [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ]
    

    collect leaf nodes

    leaves.js

    var traverse = require('traverse');
     
    var obj = {
        a : [1,2,3],
        b : 4,
        c : [5,6],
        d : { e : [7,8], f : 9 },
    };
     
    var leaves = traverse(obj).reduce(function (acc, x) {
        if (this.isLeaf) acc.push(x);
        return acc;
    }, []);
     
    console.dir(leaves);

    Output:

    [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    

    scrub circular references

    scrub.js:

    var traverse = require('traverse');
     
    var obj = { a : 1, b : 2, c : [ 3, 4 ] };
    obj.c.push(obj);
     
    var scrubbed = traverse(obj).map(function (x) {
        if (this.circular) this.remove()
    });
    console.dir(scrubbed);

    output:

    { a: 1, b: 2, c: [ 3, 4 ] }
    

    context

    Each method that takes a callback has a context (its this object) with these attributes:

    this.node

    The present node on the recursive walk

    this.path

    An array of string keys from the root to the present node

    this.parent

    The context of the node's parent. This is undefined for the root node.

    this.key

    The name of the key of the present node in its parent. This is undefined for the root node.

    this.isRoot, this.notRoot

    Whether the present node is the root node

    this.isLeaf, this.notLeaf

    Whether or not the present node is a leaf node (has no children)

    this.level

    Depth of the node within the traversal

    this.circular

    If the node equals one of its parents, the circular attribute is set to the context of that parent and the traversal progresses no deeper.

    this.update(value, stopHere=false)

    Set a new value for the present node.

    All the elements in value will be recursively traversed unless stopHere is true.

    this.remove(stopHere=false)

    Remove the current element from the output. If the node is in an Array it will be spliced off. Otherwise it will be deleted from its parent.

    this.delete(stopHere=false)

    Delete the current element from its parent in the output. Calls delete even on Arrays.

    this.before(fn)

    Call this function before any of the children are traversed.

    You can assign into this.keys here to traverse in a custom order.

    this.after(fn)

    Call this function after any of the children are traversed.

    this.pre(fn)

    Call this function before each of the children are traversed.

    this.post(fn)

    Call this function after each of the children are traversed.

    methods

    .map(fn)

    Execute fn for each node in the object and return a new object with the results of the walk. To update nodes in the result use this.update(value).

    .forEach(fn)

    Execute fn for each node in the object but unlike .map(), when this.update() is called it updates the object in-place.

    .reduce(fn, acc)

    For each node in the object, perform a left-fold with the return value of fn(acc, node).

    If acc isn't specified, acc is set to the root object for the first step and the root element is skipped.

    .paths()

    Return an Array of every possible non-cyclic path in the object. Paths are Arrays of string keys.

    .nodes()

    Return an Array of every node in the object.

    .clone()

    Create a deep clone of the object.

    install

    Using npm do:

    $ npm install traverse
    

    test

    Using expresso do:

    $ expresso
    
    100% wahoo, your stuff is not broken!
    

    in the browser

    Use browserify to run traverse in the browser.

    traverse has been tested and works with:

    • Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0
    • Firefox 3.5
    • Chrome 6.0
    • Opera 10.6
    • Safari 5.0

    Install

    npm i [email protected]

    Version

    0.5.2

    License

    MIT/X11

    Last publish

    Collaborators

    • avatar