如何使用storage.sync.set在对象内追加对象且不覆盖原有数据?
是的,你必须先通过chrome.storage.sync.get获取现有数据,将新内容合并到原有对象后,再用set覆盖存储——因为Chrome的storage API不会自动深层合并对象,当你调用set时,指定键对应的整个值会被完全替换,而不是在内部追加属性。
你之前的代码之所以会覆盖数据,核心问题是每次调用set时,都是给presentations赋值一个只包含新子对象的全新对象,这直接替换了原来的presentations,自然会丢失旧数据。
修正后的代码示例
const presentationTitle = 'Test presentation 123'; // 获取现有存储中的关键数据(presentations 和 general) chrome.storage.sync.get(['presentations', 'general'], (data) => { // 初始化 presentations 对象:如果不存在则设为空对象 let presentations = data.presentations || {}; // 检查当前标题未存在时,追加新的子对象 if (!presentations[presentationTitle]) { presentations[presentationTitle] = { duration: '00:00:00' }; } // 构造要存储的完整对象:保留原有设置,更新 presentations const updatedSettings = { ...data, // 保留原有 general 等其他设置 presentations // 替换为合并后的新 presentations 对象 }; // 存入存储 chrome.storage.sync.set(updatedSettings, () => { console.log('新演示数据已追加'); }); });
补充说明
- 使用展开运算符
...data可以保留原有所有已存储的键(比如你的general配置),避免误删其他设置 - 如果只需要维护
presentations,也可以直接构造{ presentations }调用set,但要确保不会影响其他已存储的键 - 也可以用
Object.assign实现对象合并,效果和展开运算符一致:presentations = Object.assign({}, data.presentations, { [presentationTitle]: { duration: '00:00:00' } });
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

