123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- var Flatted = (function (Primitive, primitive) {
-
- var Flatted = {
- parse: function parse(text, reviver) {
- var input = JSON.parse(text, Primitives).map(primitives);
- var value = input[0];
- var $ = reviver || noop;
- var tmp = typeof value === 'object' && value ?
- revive(input, new Set, value, $) :
- value;
- return $.call({'': tmp}, '', tmp);
- },
- stringify: function stringify(value, replacer, space) {
- for (var
- firstRun,
- known = new Map,
- input = [],
- output = [],
- $ = replacer && typeof replacer === typeof input ?
- function (k, v) {
- if (k === '' || -1 < replacer.indexOf(k)) return v;
- } :
- (replacer || noop),
- i = +set(known, input, $.call({'': value}, '', value)),
- replace = function (key, value) {
- if (firstRun) {
- firstRun = !firstRun;
- return value;
- }
- var after = $.call(this, key, value);
- switch (typeof after) {
- case 'object':
- if (after === null) return after;
- case primitive:
- return known.get(after) || set(known, input, after);
- }
- return after;
- };
- i < input.length; i++
- ) {
- firstRun = true;
- output[i] = JSON.stringify(input[i], replace, space);
- }
- return '[' + output.join(',') + ']';
- }
- };
- return Flatted;
- function noop(key, value) {
- return value;
- }
- function revive(input, parsed, output, $) {
- return Object.keys(output).reduce(
- function (output, key) {
- var value = output[key];
- if (value instanceof Primitive) {
- var tmp = input[value];
- if (typeof tmp === 'object' && !parsed.has(tmp)) {
- parsed.add(tmp);
- output[key] = $.call(output, key, revive(input, parsed, tmp, $));
- } else {
- output[key] = $.call(output, key, tmp);
- }
- } else
- output[key] = $.call(output, key, value);
- return output;
- },
- output
- );
- }
- function set(known, input, value) {
- var index = Primitive(input.push(value) - 1);
- known.set(value, index);
- return index;
- }
-
-
-
- function primitives(value) {
- return value instanceof Primitive ? Primitive(value) : value;
- }
- function Primitives(key, value) {
- return typeof value === primitive ? new Primitive(value) : value;
- }
- }(String, 'string'));
|