向localStorage追加数据失败,无法将指定字段加入目标对象
兄弟,我看你这问题主要踩了两个坑,先帮你理清楚报错原因,再给你一步步的解决办法:
首先你遇到的 result.push is not a function 报错,核心原因很直白:push 是数组的专属方法,但你从 localStorage 里取出来解析后的 test-params 是个对象,不是数组,用数组方法操作对象肯定会报错!
再看你的数据结构问题:现在 localStorage 里的 fullname 和 picture 是独立的键,而 test-params 是一个字符串化的对象。你要做的是把这两个字段移到 test-params 这个对象内部,对吧?
那正确的操作步骤应该是这样的:
1. 修正键名,正确取出并解析目标对象
先看你原代码里的 localStorage.getItem("oauth2-test-params"),但从你的 console.log(localStorage) 结果来看,实际的键是 test-params,这首先就会导致你取出来的 result 是 null 或者不是你要的对象!所以第一步要把键名改对,再把字符串解析成 JS 对象:
// 取出test-params对应的字符串,键名要和localStorage里的一致 let testParamsStr = localStorage.getItem('test-params'); // 把字符串解析成可操作的JS对象 let testParams = JSON.parse(testParamsStr);
2. 给目标对象添加属性
现在 testParams 是普通的 JS 对象,直接给它添加 fullname 和 picture 属性就行,完全不需要用 push:
// 可以从localStorage直接取已有的值,或者用你自己的data变量 let fullname = localStorage.getItem('fullname') || 'Junk'; let picture = localStorage.getItem('picture') || 'two'; // 直接给对象赋值添加属性 testParams.fullname = fullname; testParams.picture = picture;
3. 把更新后的对象重新存回localStorage
因为 localStorage 只能存储字符串,所以要把修改后的对象重新转成字符串,再存回去:
// 把更新后的对象转成JSON字符串 let updatedTestParamsStr = JSON.stringify(testParams); // 存回localStorage的test-params键 localStorage.setItem('test-params', updatedTestParamsStr);
4. (可选)清理多余的独立键
如果你不需要原来 localStorage 里独立的 fullname 和 picture 了,可以把它们删掉:
localStorage.removeItem('fullname'); localStorage.removeItem('picture');
完整可运行代码
把上面的步骤整合起来就是:
// 1. 取出并解析目标对象 let testParamsStr = localStorage.getItem('test-params'); let testParams = JSON.parse(testParamsStr); // 2. 添加需要的属性到对象中 testParams.fullname = "Junk"; testParams.picture = "two"; // 3. 重新持久化到localStorage localStorage.setItem('test-params', JSON.stringify(testParams)); // 可选:清理不再需要的独立键 localStorage.removeItem('fullname'); localStorage.removeItem('picture');
执行完这段代码后,你的 localStorage 就会变成你想要的结构:
{ "test-params": "{\"fullname\":\"Junk\",\"picture\":\"two\",\"three\":\"77-96L2N\",\"four\":\"junk\",\"five\":\"Bearer\",\"expires_in\":\"3599\"}" }
备注:内容来源于stack exchange,提问作者newdeveloper

