Skip to content

Instantly share code, notes, and snippets.

@cmc19
Created March 21, 2014 12:11

Revisions

  1. cmc19 created this gist Mar 21, 2014.
    39 changes: 39 additions & 0 deletions safeStringify.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,39 @@
    (function (root) {
    root.stringifySafe = stringify;
    function stringify(obj, fn, spaces, decycle) {
    return JSON.stringify(obj, getSerialize(fn, decycle), spaces);


    function getSerialize(fn, decycle) {
    var seen = [], keys = [];
    decycle = decycle || function (key, value) {
    return '[Circular ' + getPath(value, seen, keys) + ']'
    };
    return function (key, value) {
    var ret = value;
    if (typeof value === 'object' && value) {
    if (seen.indexOf(value) !== -1)
    ret = decycle(key, value);
    else {
    seen.push(value);
    keys.push(key);
    }
    }
    if (fn) ret = fn(key, ret);
    return ret;
    }
    }

    function getPath(value, seen, keys) {
    var index = seen.indexOf(value);
    var path = [keys[index]];
    for (index--; index >= 0; index--) {
    if (seen[index][path[0]] === value) {
    value = seen[index];
    path.unshift(keys[index]);
    }
    }
    return '~' + path.join('.');
    }
    }
    })(JSON);