【问题标题】:string to map object in javascript在javascript中映射对象的字符串
【发布时间】:2018-02-08 00:08:45
【问题描述】:

var map = new Map();
map.set('key1','value1');
map.set('key2','value2');

console.log(map);
console.log(map.toString());
console.log(JSON.parse(map.toString()))
//Uncaught SyntaxError: Unexpected token o in JSON at position 1

使用toString() 将地图对象转换为字符串,现在我无法从字符串转换为地图对象。

【问题讨论】:

  • “Uncaught SyntaxError: Unexpected token o in JSON at position 1”表示您尝试解析的内容通常是[object Object],但在本例中为[object Map]
  • 这是 [object Map] 一个有效的 JSON 吗?
  • 提示:如果上面写着“[object Map]”,那么这里就没有隐藏更多神奇的信息了。 “[object Map]”实际上是您要在此处解析的字符串,显然您将永远无法从中获得您的value1value2
  • @Rajesh 如何再次串起来?我只试过 JSON.parse
  • Map 不兼容 JSON,这是因为键可以是任何东西,包括对象等。如果您使用简单的键值/对,则改用 Object.create(null) 可能更容易。

标签: javascript


【解决方案1】:

要存储字符串化结果,最好使用纯 JSON 对象,但是使用 Map 您可以创建一个条目数组并将其字符串化

var str = JSON.stringify(Array.from( map.entries()));

然后你可以再次将 JSON 字符串解析为数组并构造一个新的Map

var map = new Map(JSON.parse(str))

var map1 = new Map();
map1.set('key1','value1');
map1.set('key2','value2');

var str = JSON.stringify(Array.from( map1.entries()));

//store the string somewhere or pass it to someone
//or however you want to carry it

//re construct the map again
var map2 = new Map(JSON.parse(str))

console.log('key1', map2.get('key1'));
console.log('key2', map2.get('key2'));

然而,Array.from(map) 或 using 也将返回相同的东西,并且可以在这里使用,但是在执行它之前,有人不能授予它实际返回的内容,另一方面,获取一个迭代器然后形成一个数组更多常规且可读,但是 Array.from(map) 可能是更好的解决方案。此外,spread operator 可以用于 ma​​p [...map]ma​​p.entries() [...map.entries()] 以形成相同的条目数组。

【讨论】:

  • 我曾经对 Javascript 感到惊讶,这几乎是有效的英语……“JSON-stringify array from map entries”。
  • 不错的解决方案,我可以建议你制作一个片段。
  • 哦,当然,让我编辑。这对其他人会更有帮助:)
【解决方案2】:

var map = new Map();
map.set('key1','value1');
map.set('key2','value2');

console.log(map);
//Covert your map object into JSON object
var jsonObj=[];

map.forEach(function(val,key){
var tempObj={};
tempObj[key]=val;
jsonObj.push(tempObj)
})

console.log(JSON.stringify(jsonObj));
console.log(JSON.parse(JSON.stringify(jsonObj)))
//Uncaught SyntaxError: Unexpected token o in JSON at position 1

【讨论】:

    【解决方案3】:

    这是因为 map.toString() 打印的 [object Map] 无法被 JSON.parse 解析

    您应该使用JSON.stringify 来实现您的目标

    更正的脚本

    var map = new Map().set('key1','value1')
    .set('key2','value2');
    
    console.log(map);
    //since the underlying type is array requires to be expanded [...map]
    console.log(JSON.stringify([...map])); 
    
    map2 = new Map(JSON.parse(JSON.stringify([...map])));

    记住:映射是不可变对象,底层类型是数组,你必须重新分配映射变量或链接集合函数。

    完整的解释可以在这里找到:http://2ality.com/2015/08/es6-map-json.html

    【讨论】:

    • 我更正了。虽然它强调这不起作用......
    • 这会导致一个空对象......这有什么用:p
    • 刚刚编辑,抱歉你们太快了 :D :D :D,请删除不赞成票,现在是正确的
    • 差不多…… 结果是一个数组,而不是一个 Map。
    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 2016-11-24
    • 2014-10-31
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多