cyclical-json
Version:
JSON Sterilization for Cyclical Objects
6 lines (5 loc) • 2.08 kB
JavaScript
/*!
* cyclical-json-2.1.4
* (c) Louis Buchbinder 2017 MIT
*/
!function(){var n={},t=function(){var n=function(){Object.defineProperties(this,{keys:{value:[]},values:{value:[]}})};return n.prototype.get=function(n){var t=this.keys.indexOf(n);return this.values[t]},n.prototype.has=function(n){return this.keys.indexOf(n)>=0},n.prototype.set=function(n,t){var e=this.keys.indexOf(n);return e>=0?this.values[e]=t:(this.keys.push(n),this.values.push(t)),this},n}(),e=function(n){return"object"!=typeof n||null===n||"function"==typeof n.toJSON||n instanceof String||n instanceof Number||n instanceof RegExp||n instanceof Date||n instanceof Boolean},r=function(n){return"string"==typeof n&&0===n.indexOf("~~")},i=function(n){return"string"==typeof n&&0===n.indexOf("~")&&!r(n)},o=function(n){return i(n)||r(n)?"~"+n:n},u=function(n){return n.slice(1)},c=function(n){return"function"!=typeof n?n:function(t,e){return r(e)?o(n(t,u(e))):i(e)?e:n(t,e)}},f=function(n){return"function"!=typeof n?n:function(t,e){return r(e)?o(n(t,u(e))):i(e)?e:n(t,e)}},s=function(n){var r=[],i=new t,u=function(n,t){var c=n;return e(n)||(i.has(n)?(i.get(n)instanceof Array&&(r.push(i.get(n)),i.set(n,String("~"+(r.length-1)))),c=i.get(n)):(i.set(n,t),c=Object.keys(n).reduce(function(e,r){return e[r]=u(n[r],t.concat(r)),e},n instanceof Array?[]:{}))),"string"==typeof n&&(c=o(n)),c};return{legend:r,main:u(n,[])}},a=function(n){var t=function(o,c,f){var s,a=o;return e(o)||Object.keys(o).forEach(function(n){return t(o[n],n,o)}),i(o)&&(a=n.main,s=Number(u(o)),n.legend[s].forEach(function(n){return a=a[n]})),r(o)&&(a=u(o)),f&&(f[c]=a),a};return"object"!=typeof n||null===n||void 0===n.main||void 0===n.legend||!(n.legend instanceof Array)||void 0===n.version||n.version.indexOf("cyclical-json")<0?n:t(n.main)};n.stringify=function(n,t,e){var r=s(n),i=JSON.stringify(r.legend),o=JSON.stringify(r.main,c(t),e);return void 0!==o?'{"legend":'+i+',"main":'+o+',"version":"cyclical-json@2.1.4"}':o},n.parse=function(n,t){return a(JSON.parse(n,f(t)))};try{module.exports=n}catch(t){window.cyclicalJSON=n}}();