J'aimerais commencer à utiliser ES6 Map au lieu d'objets JS mais je suis retenu car je ne peux pas comprendre comment JSON.stringify () une Map. Il est garanti que mes clés sont des chaînes et mes valeurs seront toujours répertoriées. Dois-je vraiment écrire une méthode wrapper pour sérialiser?
105
[...someMap.entries()].join(';')
; pour quelque chose de plus complexe, vous pouvez essayer quelque chose de similaire en utilisant quelque chose comme[...someMap.entries()].reduce((acc, cur) => acc + `${cur[0]}:${/* do something to stringify cur[1] */ }`, '')
obj[key]
peut vous apporter quelque chose d'inattendu. Considérez le casif (!obj[key]) obj[key] = newList; else obj[key].mergeWith(newList);
.Réponses:
Vous ne pouvez pas.
Les clés d'une carte peuvent être n'importe quoi, y compris des objets. Mais la syntaxe JSON n'autorise que les chaînes en tant que clés. C'est donc impossible dans un cas général.
Dans ce cas, vous pouvez utiliser un objet simple. Il aura ces avantages:
la source
hasOwnProperty
. Sans cela, Firefox itère les objets beaucoup plus rapidement que les cartes. Les cartes sont cependant encore plus rapides sur Chrome. jsperf.com/es6-map-vs-object-properties/95Vous ne pouvez pas directement stringifier l'
Map
instance car elle n'a aucune propriété, mais vous pouvez la convertir en un tableau de tuples:Pour l'inverse, utilisez
la source
Map
s, cela va bien avec le constructeur et l'itérateur. C'est aussi la seule représentation sensée des cartes qui ont des clés sans chaîne, et l'objet ne fonctionnerait pas là.JSON.stringify(Object.fromEntries(map.entries()))
etnew Map(Object.entries(JSON.parse(jsonText)))
key
est un objet, par exemple"{"[object Object]":{"b":2}}"
- les clés d'objet étant l'une des principales fonctionnalités de MapsLes deux
JSON.stringify
etJSON.parse
soutiennent un deuxième argument.replacer
etreviver
respectivement. Avec replacer et reviver ci-dessous, il est possible d'ajouter la prise en charge de l'objet Map natif, y compris des valeurs profondément imbriquéesUtilisation :
Imbrication profonde avec combinaison de tableaux, d'objets et de cartes
la source
Bien qu'il n'y ait pas encore de méthode fournie par ecmascript, cela peut toujours être fait en utilisant
JSON.stingify
si vous mappez leMap
à une primitive JavaScript. Voici l'exemple queMap
nous utiliserons.Accéder à un objet JavaScript
Vous pouvez convertir en littéral objet JavaScript avec la fonction d'assistance suivante.
Accéder à un tableau d'objets JavaScript
La fonction d'assistance pour celui-ci serait encore plus compacte
Aller à Array of Arrays
C'est encore plus facile, vous pouvez simplement utiliser
la source
Utilisation de la sytaxe de propagation La carte peut être sérialisée sur une seule ligne:
et désérialisez-le avec:
la source
Stringifier une
Map
instance (les objets comme clés sont OK) :ou
ou
format de sortie:
la source
Une meilleure solution
Production
J'espère que c'est moins grincheux que les réponses ci-dessus.
la source
IJSONAble
interface (en utilisant TypeScript, bien sûr).La solution ci-dessous fonctionne même si vous avez des cartes imbriquées
la source
Map
et (pire encore) que chaque sous-carte (qu'elle contient) était également à l'origine une carte. Sinon, il n'y a aucun moyen d'être sûr qu'unarray of pairs
n'est pas simplement destiné à être exactement cela, au lieu d'une carte. Les hiérarchies d'objets et de tableaux ne supportent pas ce fardeau lorsqu'elles sont analysées. Toute sérialisation appropriée deMap
indiquerait explicitement qu'il s'agit d'un fichierMap
.