On Oct 4, 2012, at 5:32 PM, Rick Waldron wrote: > > > On Thu, Oct 4, 2012 at 8:16 PM, Brendan Eich <bren...@mozilla.org> wrote: > Nicholas C. Zakas wrote: > I agree, I'm not sure there is a rational default for Map, but I think there > is one for Set as an array (and it seems like most people agreed). > > As with Set, I claim the default JSON for Map should be > > [[key1, value1], ~~~ [keyN, valueN]] > > > I'm still curious about my question from yesterday; instead of repasting, I > put it in a gist: > > https://gist.github.com/3837337 >
Something like: {"<kind>" : "Map", "<mapData>" : [ [ key1, value1], [ keyN, valueN] ] } is arguably a better because then you can write a reviver function that recognizes it: function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } } function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } } function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } } function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } } function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } } function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } } function mapReviver(key, value) { if (typeof value != "object") return value; switch (value["<kind>"]){ case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(e=>newValue.set(e[0], e[1])); return newValue; } default: return value; } } var tree = JSON.parse(sourceString, mapReviver); This should work for Map's nested at any level of a JSON tree, including Maps nested within Maps. Allen if (typeof value != "object") return value; switch (value["<kind>"]) { case undefined: return value; case "Map": { let newValue = new Map; let mapData = value["<mapData>"]; if (!mapData) return value; mapData.forEach(function(e){newValue.set(e[0], e[1])}); return newValue; } default: return value; } }
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss