javascript - 如何比较对象并在 localStorage 中添加/删除道具?
问题描述
即我有一个初始状态:
const initialState = {
val1: 1,
val1: 2,
}
我想检查 my是否具有与 my不时更改的localStorage
所有相同属性。initialState
- 如果是 => 跳到下一个道具
- 如果没有 => 添加
prop: val
到localStorage
- 如果
localStorage
在 => 上有一个不存在initialState
的道具,请从localStorage
.
在这里,我向 localStorage 添加了新的道具,它可以工作,但在每个新道具上prop
我都添加了整个 newState。
const setNewLocalStorage = () => {
const localStorageState = getLocalStorageState()
let newState = localStorageState
Object.keys(initialState).map(key => {
if (!localStorageState.hasOwnProperty(key)) {
newState[key] = initialState[key]
setStateToLocalStorage(newState)
}
return
})
}
解决方案
回答 XY 的 Y
这是您可以存储数据的方式:
const setNewLocalStorage = () => {
Object.keys(initialState).map(key => {
// Do various checking to decide whether or not to write
if (!localStorageState.hasOwnProperty(key) || JSON.parse(localStorage.getItem(key)) !== initialState[key]) {
localStorage.setItem(key, JSON.stringify(initialState[key])
}
// But actually that is more complex than need be.
// Why not just store the data every time, and be done with?
localStorage.setItem(key, JSON.stringify(initialState[key])
})
}
请注意,建议在读取或写入 localStorage 时使用JSON.stringify()
and JSON.parse()
,因为 localStorage 仅存储字符串,而您的数据似乎包含数字。
第二部分:
如果 localStorage 中有一个在 initialState 上不存在的道具 => 从 localStorage 中删除该道具
我不确定这是可取的。如果您在应用程序中添加一个插件,该插件也将数据存储在 localStorage 中怎么办?您最终将清除该插件的数据!
因此,拥有要删除的“oldKeys”的特定列表可能更安全。或者,命名您的密钥,以便您知道哪些密钥属于应用程序的这一部分。
也就是说,您可以按照以下方式执行您的要求:
for (var i = localStorage.length; i--;) {
var key = localStorage.key(i);
if (!initialState.hasOwnProperty(key)) {
localStorage.removeItem(key);
}
}
我建议向后循环,因为如果您删除项目,长度和索引可能会改变。(或者,先提取密钥,然后再提取它们。)
推荐阅读
- android - 以反向横向模式锁定我的 android 应用程序
- javascript - 如何使用 Firestore 从静态 SVG 文件创建具有动态链接的图像映射
- api - Algolia 自动完成 - 如何从自动完成建议中删除“行政”市/区
- android - 我们可以停止一个 groupview 在触摸它时不显示它的 childList(对于某些特定情况)
- c++ - vector::insert() 中的有效位置如何?
- c# - 获取与具体用户对应的用户角色
- c# - 是否可以使用异步任务永久更改布尔值?
- sql-server - 将字符串数据类型日期值转换为日期格式dd-mm-yyyy
- python-3.x - 如何检查数组是否包含没有 for 循环的子数组并检索 True 的索引?
- r - 是否有 R 函数用于在提取到 R 时突出显示粗体字符