You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							59 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							59 lines
						
					
					
						
							1.8 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
module.exports = function (data, opts) { | 
						|
    if (!opts) opts = {}; | 
						|
    if (typeof opts === 'function') opts = { cmp: opts }; | 
						|
    var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false; | 
						|
 | 
						|
    var cmp = opts.cmp && (function (f) { | 
						|
        return function (node) { | 
						|
            return function (a, b) { | 
						|
                var aobj = { key: a, value: node[a] }; | 
						|
                var bobj = { key: b, value: node[b] }; | 
						|
                return f(aobj, bobj); | 
						|
            }; | 
						|
        }; | 
						|
    })(opts.cmp); | 
						|
 | 
						|
    var seen = []; | 
						|
    return (function stringify (node) { | 
						|
        if (node && node.toJSON && typeof node.toJSON === 'function') { | 
						|
            node = node.toJSON(); | 
						|
        } | 
						|
 | 
						|
        if (node === undefined) return; | 
						|
        if (typeof node == 'number') return isFinite(node) ? '' + node : 'null'; | 
						|
        if (typeof node !== 'object') return JSON.stringify(node); | 
						|
 | 
						|
        var i, out; | 
						|
        if (Array.isArray(node)) { | 
						|
            out = '['; | 
						|
            for (i = 0; i < node.length; i++) { | 
						|
                if (i) out += ','; | 
						|
                out += stringify(node[i]) || 'null'; | 
						|
            } | 
						|
            return out + ']'; | 
						|
        } | 
						|
 | 
						|
        if (node === null) return 'null'; | 
						|
 | 
						|
        if (seen.indexOf(node) !== -1) { | 
						|
            if (cycles) return JSON.stringify('__cycle__'); | 
						|
            throw new TypeError('Converting circular structure to JSON'); | 
						|
        } | 
						|
 | 
						|
        var seenIndex = seen.push(node) - 1; | 
						|
        var keys = Object.keys(node).sort(cmp && cmp(node)); | 
						|
        out = ''; | 
						|
        for (i = 0; i < keys.length; i++) { | 
						|
            var key = keys[i]; | 
						|
            var value = stringify(node[key]); | 
						|
 | 
						|
            if (!value) continue; | 
						|
            if (out) out += ','; | 
						|
            out += JSON.stringify(key) + ':' + value; | 
						|
        } | 
						|
        seen.splice(seenIndex, 1); | 
						|
        return '{' + out + '}'; | 
						|
    })(data); | 
						|
};
 | 
						|
 |