Me gustaría comenzar a usar ES6 Map en lugar de objetos JS, pero me están reteniendo porque no puedo averiguar cómo JSON.stringify () un mapa. Se garantiza que mis claves serán cadenas y mis valores siempre estarán listados. ¿Realmente tengo que escribir un método contenedor para serializar?
105
[...someMap.entries()].join(';')
; para algo más complejo, puede probar algo similar usando algo como[...someMap.entries()].reduce((acc, cur) => acc + `${cur[0]}:${/* do something to stringify cur[1] */ }`, '')
obj[key]
puede traerle algo inesperado. Considere el casoif (!obj[key]) obj[key] = newList; else obj[key].mergeWith(newList);
.Respuestas:
No puedes.
Las claves de un mapa pueden ser cualquier cosa, incluidos los objetos. Pero la sintaxis JSON solo permite cadenas como claves. Entonces es imposible en un caso general.
En este caso, puede utilizar un objeto simple. Tendrá estas ventajas:
fuente
hasOwnProperty
. Sin eso, Firefox itera objetos mucho más rápido que los mapas. Sin embargo, los mapas son aún más rápidos en Chrome. jsperf.com/es6-map-vs-object-properties/95No puede secuenciar directamente la
Map
instancia ya que no tiene ninguna propiedad, pero puede convertirla en una matriz de tuplas:Para el reverso, use
fuente
Map
s, va bien con el constructor y el iterador. Además, es la única representación sensata de mapas que tienen claves que no son cadenas, y el objeto no funcionaría allí.JSON.stringify(Object.fromEntries(map.entries()))
ynew Map(Object.entries(JSON.parse(jsonText)))
key
es un objeto, por ejemplo"{"[object Object]":{"b":2}}"
, las claves de objeto son una de las características principales de MapsAmbos
JSON.stringify
yJSON.parse
apoyan un segundo argumento.replacer
yreviver
respectivamente. Con el reemplazo y el reviver a continuación, es posible agregar soporte para el objeto Map nativo, incluidos los valores profundamente anidadosUso :
Anidación profunda con combinación de matrices, objetos y mapas
fuente
Si bien ecmascript aún no proporciona un método, esto aún se puede hacer usando
JSON.stingify
si asigna elMap
a una primitiva de JavaScript. Aquí está la muestraMap
que usaremos.Ir a un objeto JavaScript
Puede convertir a JavaScript Object literal con la siguiente función auxiliar.
Ir a una matriz de objetos de JavaScript
La función de ayuda para este sería aún más compacta
Ir a Matriz de matrices
Esto es aún más fácil, solo puede usar
fuente
El uso de spread sytax Map se puede serializar en una línea:
y deserializarlo con:
fuente
Cadena de una
Map
instancia (los objetos como claves están bien) :o
o
formato de salida:
fuente
Una mejor solucion
Salida
Espero que sea menos vergonzoso que las respuestas anteriores.
fuente
IJSONAble
interfaz pequeña (usando TypeScript, por supuesto).La siguiente solución funciona incluso si tiene mapas anidados
fuente
Map
y (peor aún) que cada submapa (que contiene) también era originalmente un mapa. De lo contrario, no hay forma de estar seguro de que unarray of pairs
no solo pretende ser exactamente eso, en lugar de un Mapa. Las jerarquías de objetos y matrices no llevan esta carga cuando se analizan. Cualquier serialización adecuada deMap
indicaría explícitamente que es unMap
.