有关JSON.stringify( )的问题

let knowledgeData =[];

    let initialKnowledge = [
        [
            ["id", 1],
            ["title", "关于float的那些事儿"],
            ["URL", "http://www.w3school.com.cn/cssref/pr_class_float.asp"],
            ["progress", 100],
            ["evaluation", 3],
            ["notes", "关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿"],
            ["tags", ["1", "2", "3"]]
        ], [
            ["id", 2],
            ["title", "position知多少"],
            ["URL", "http://www.w3school.com.cn/cssref/pr_class_position.asp"],
            ["progress", 75],
            ["evaluation", 4],
            ["notes", "position知多少position知多少position知多少position知多少position知多少position知多少position知多少position知多少position知多少"],
            ["tags", ["1", "2"]]
        ], [
            ["id", 3],
            ["title", "1211gfdhfnndhdfhdfgfd"],
            ["URL", "http://www.w3school.com.cn/cssref/pr_class_position.asp"],
            ["progress", 66],
            ["evaluation", 2],
            ["notes", "gfgitiongdfgfdh42356576654435u6uyuydhfjyrdjfjyrdhhvjtdyrdhhmvjdhhmvhthhgchvjyhmhvjyhdgmhvhyedtjfhjyyedtjykkfuuysjx"],
            ["tags", ["2", "3"]]
        ]
    ];

    for (let knowledge of initialKnowledge) {
        knowledgeData.push(new Map(knowledge));
    }


    localStorage.setItem("knowledgeData", JSON.stringify(knowledgeData));

遇到问题:现在将knowledgeData这个数组转换成JSON字符串存到localStorage中,再使用JSON.parse(localStorage.getItem("knowledgeData"))取出,是空的,不知道为什么?是因为使用了Map的原因吗?求大神解答

阅读 2.6k
2 个回答

如下所示是可以的,map在stringify前需要转化成对象

function strMapToObj(strMap) {
    let obj = Object.create(null);
    for (let [k,v] of strMap) {
        obj[k] = v;
    }
    return obj;
}

let knowledgeData =[];

let initialKnowledge = [
    [
        ["id", 1],
        ["title", "关于float的那些事儿"],
        ["URL", "http://www.w3school.com.cn/cssref/pr_class_float.asp"],
        ["progress", 100],
        ["evaluation", 3],
        ["notes", "关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿"],
        ["tags", ["1", "2", "3"]]
    ], [
        ["id", 2],
        ["title", "position知多少"],
        ["URL", "http://www.w3school.com.cn/cssref/pr_class_position.asp"],
        ["progress", 75],
        ["evaluation", 4],
        ["notes", "position知多少position知多少position知多少position知多少position知多少position知多少position知多少position知多少position知多少"],
        ["tags", ["1", "2"]]
    ], [
        ["id", 3],
        ["title", "1211gfdhfnndhdfhdfgfd"],
        ["URL", "http://www.w3school.com.cn/cssref/pr_class_position.asp"],
        ["progress", 66],
        ["evaluation", 2],
        ["notes", "gfgitiongdfgfdh42356576654435u6uyuydhfjyrdjfjyrdhhvjtdyrdhhmvjdhhmvhthhgchvjyhmhvjyhdgmhvhyedtjfhjyyedtjykkfuuysjx"],
        ["tags", ["2", "3"]]
    ]
];

for (let knowledge of initialKnowledge) {
    knowledgeData.push(strMapToObj(new Map(knowledge)));
}
   localStorage.setItem("knowledgeData", JSON.stringify(knowledgeData));

1.json 是不支持 map 的,在序列化前需要将 map 转换为 object。
2.楼上的做法稍微有点麻烦,将 map 转换为 object,其实只需要 [...map] 就好了。

更为简洁的写法:

let knowledgeData =[]

let initialKnowledge = [
    [
        ["id", 1],
        ["title", "关于float的那些事儿"],
        ["URL", "http://www.w3school.com.cn/cssref/pr_class_float.asp"],
        ["progress", 100],
        ["evaluation", 3],
        ["notes", "关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿关于float的那些事儿"],
        ["tags", ["1", "2", "3"]]
    ], [
        ["id", 2],
        ["title", "position知多少"],
        ["URL", "http://www.w3school.com.cn/cssref/pr_class_position.asp"],
        ["progress", 75],
        ["evaluation", 4],
        ["notes", "position知多少position知多少position知多少position知多少position知多少position知多少position知多少position知多少position知多少"],
        ["tags", ["1", "2"]]
    ], [
        ["id", 3],
        ["title", "1211gfdhfnndhdfhdfgfd"],
        ["URL", "http://www.w3school.com.cn/cssref/pr_class_position.asp"],
        ["progress", 66],
        ["evaluation", 2],
        ["notes", "gfgitiongdfgfdh42356576654435u6uyuydhfjyrdjfjyrdhhvjtdyrdhhmvjdhhmvhthhgchvjyhmhvjyhdgmhvhyedtjfhjyyedtjykkfuuysjx"],
        ["tags", ["2", "3"]]
    ]
]

for (let k of initialKnowledge) {
    knowledgeData.push([...k])
}

localStorage.setItem("knowledgeData", JSON.stringify(knowledgeData))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题