Me gustaría comenzar a usar ES6 Map en lugar de objetos JS, pero me detengo porque no puedo entender cómo JSON.stringify() a Map . Se garantiza que mis claves serán cadenas y mis valores siempre aparecerán en la lista. ¿Realmente tengo que escribir un método contenedor para serializar?
Tanto JSON.stringify como JSON.parse admiten un segundo argumento. reviver replacer . Con replacer y reviver a continuación, es posible agregar soporte para el objeto de mapa nativo, incluidos los valores profundamente anidados
function replacer(key, value) { if(value instanceof Map) { return { dataType: 'Map', value: Array.from(value.entries()), // or with spread: value: [...value] }; } else { return value; } } function reviver(key, value) { if(typeof value === 'object' && value !== null) { if (value.dataType === 'Map') { return new Map(value.value); } } return value; }uso :
const originalValue = new Map([['a', 1]]); const str = JSON.stringify(originalValue, replacer); const newValue = JSON.parse(str, reviver); console.log(originalValue, newValue);Anidamiento profundo con combinación de matrices, objetos y mapas
const originalValue = [ new Map([['a', { b: { c: new Map([['d', 'text']]) } }]]) ]; const str = JSON.stringify(originalValue, replacer); const newValue = JSON.parse(str, reviver); console.log(originalValue, newValue);No puede secuenciar directamente la instancia del Map ya que no tiene ninguna propiedad, pero puede convertirla en una matriz de tuplas:
jsonText = JSON.stringify(Array.from(map.entries()));Para el reverso, utilice
map = new Map(JSON.parse(jsonText));no puedes
Las claves de un mapa pueden ser cualquier cosa, incluidos los objetos. Pero la sintaxis JSON solo permite cadenas como claves. Así que es imposible en un caso general.
Se garantiza que mis claves serán cadenas y mis valores siempre serán listas
En este caso, puede utilizar un objeto plano. Tendrá estas ventajas: