Gostaria de começar a usar o mapa ES6 em vez de objetos JS, mas estou sendo impedido porque não consigo descobrir como JSON.stringify () um mapa. Minhas chaves são strings e meus valores sempre serão listados. Eu realmente preciso escrever um método wrapper para serializar?
103
[...someMap.entries()].join(';')
; para algo mais complexo, você pode tentar algo semelhante usando algo como[...someMap.entries()].reduce((acc, cur) => acc + `${cur[0]}:${/* do something to stringify cur[1] */ }`, '')
obj[key]
pode lhe trazer algo inesperado. Considere o casoif (!obj[key]) obj[key] = newList; else obj[key].mergeWith(newList);
.Respostas:
Você não pode.
As chaves de um mapa podem ser qualquer coisa, incluindo objetos. Mas a sintaxe JSON permite apenas strings como chaves. Portanto, é impossível em um caso geral.
Nesse caso, você pode usar um objeto simples. Terá estas vantagens:
fonte
hasOwnProperty
. Sem isso, o Firefox itera objetos muito mais rápido do que mapas. Os mapas são ainda mais rápidos no Chrome, no entanto. jsperf.com/es6-map-vs-object-properties/95Você não pode stringificar diretamente a
Map
instância, pois ela não tem nenhuma propriedade, mas pode convertê-la em uma matriz de tuplas:Para o reverso, use
fonte
Map
s, e combina com o construtor e o iterador. Além disso, é a única representação sensata de mapas que possuem chaves não-string e o objeto não funcionaria lá.JSON.stringify(Object.fromEntries(map.entries()))
enew Map(Object.entries(JSON.parse(jsonText)))
key
for um objeto, por exemplo"{"[object Object]":{"b":2}}"
- chaves de objetos sendo uma das principais características do MapsAmbos
JSON.stringify
eJSON.parse
apóiam um segundo argumento.replacer
ereviver
respectivamente. Com substituto e reviver abaixo, é possível adicionar suporte para objeto de mapa nativo, incluindo valores profundamente aninhadosUso :
Aninhamento profundo com combinação de Arrays, Objetos e Mapas
fonte
Embora não haja nenhum método fornecido pelo ecmascript ainda, isso ainda pode ser feito usando
JSON.stingify
se você mapear oMap
para um primitivo JavaScript. Aqui está o exemploMap
que usaremos.Indo para um objeto JavaScript
Você pode converter para o literal de objeto JavaScript com a seguinte função auxiliar.
Indo para um array de objetos JavaScript
A função auxiliar para este seria ainda mais compacta
Indo para Array of Arrays
Isso é ainda mais fácil, você pode apenas usar
fonte
Usando o spread sytax, o Map pode ser serializado em uma linha:
e desserialize-o com:
fonte
Stringify uma
Map
instância (objetos como chaves estão OK) :ou
ou
Formato de saída:
fonte
Uma Solução Melhor
Resultado
Espero que seja menos irritante do que as respostas acima.
fonte
IJSONAble
interface pequena (usando TypeScript, é claro).A solução abaixo funciona mesmo se você tiver mapas aninhados
fonte
Map
e (pior ainda) que cada submapa (que contém) também era originalmente um mapa. Caso contrário, não há como ter certeza de que umarray of pairs
não se destina a ser exatamente isso, em vez de um mapa. Hierarquias de objetos e arrays não carregam esse fardo quando analisadas. Qualquer serialização adequada deMap
indicaria explicitamente que é umMap
.