Skip to content

Instantly share code, notes, and snippets.

@logicalparadox
Forked from indexzero/gist:2331488
Created April 7, 2012 19:26
Show Gist options
  • Save logicalparadox/2331533 to your computer and use it in GitHub Desktop.
Save logicalparadox/2331533 to your computer and use it in GitHub Desktop.
safe .toJSON()
function toString (obj) {
function _toString (i) {
if (obj[i] === null) return 'null'
if (typeof obj[i] === 'undefined') return 'undefined'
if (obj[i].toString) return obj[i].toString()
else return ''
}
return _toString
}
function eq (x, y) {
if (Object.keys(x).toString() !== Object.keys(y).toString()) return false
if (Object.keys(x).map(toString(x)).toString() !==
Object.keys(y).map(toString(y)).toString() ) return false
return true
}
function getSafe (self, circular) {
if (typeof self === 'object' || typeof self === 'function') var safe = {}
if (Array.isArray(self)) var safe = []
if (!circular) circular = [self]
var recurse = []
Object.keys(self).forEach(function (i) {
if (i === 'toJSON') return
if (typeof self[i] !== 'object' && typeof self[i] !== 'function') return safe[i] = self[i]
if (self[i] === null) return safe[i] = self[i]
for (var x=0;x<circular.length;x++) {
if (eq(circular[x], self[i])) return
}
recurse.push(i)
})
for (var i=0;i<recurse.length;i++) {
circular.push(self[recurse[i]])
safe[recurse[i]] = getSafe(self[recurse[i]], circular)
}
return safe
}
function toJSON () {
return getSafe(this)
}
// MyObject.prototype.toJSON = toJSON
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment