You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LocalStorage存储合并数组不生效,退出站点后数组重置为初始值问题求助

问题根源
  • setTimeout的延迟参数设置为1500000000000000毫秒,换算后约为4756万年,页面运行后根本不会触发回调内的逻辑,合并、存储、读取操作从未执行
  • 数组初始化逻辑顺序错误:每次进入页面arr1初始值为空,你优先判断为空就赋值初始数组[1,2,3,4,5],不会优先读取LocalStorage存储的旧值,导致存储的结果永远被初始值覆盖
  • Storage原型的扩展方法写在定时器回调内部,第一次调用getObj时方法还未挂载,会直接抛出未定义错误
  • 读取LocalStorage时没有做空值兜底,如果存储项不存在getObj会返回null,后续调用数组方法indexOf、concat都会报错
修复后的完整代码
// 先全局扩展Storage方法,避免调用时未定义
Storage.prototype.setObj = function(key, obj) {
  return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
  return JSON.parse(this.getItem(key))
}

let arr1 = []
// 初始化优先读LocalStorage,读不到再用初始值
const localArr = localStorage.getObj("StoreArrToken")
arr1 = localArr && Array.isArray(localArr) ? localArr : [1,2,3,4,5]

// 移除无意义的超长延迟setTimeout,直接启动定时任务
setInterval(myTimer, 5000)

function myTimer() {
  let arr2 = [6, 8, 10]
  // 筛选arr2中不在arr1里的非重复元素
  const noDuplicate = arr2.filter(val => !arr1.includes(val))
  if (noDuplicate.length === 0) {
    console.log("无新增非重复元素")
  } else {
    arr1 = arr1.concat(noDuplicate)
    console.log("合并后的数组:", arr1)
    // 存储更新后的数组
    localStorage.setObj("StoreArrToken", arr1)
  }
}
核心修改说明
  • 将Storage原型方法扩展提到代码最顶部,全局可用
  • 初始化阶段优先读取LocalStorage存储值,仅当存储值不存在时才使用初始数组
  • 移除了超长延迟的setTimeout,确保定时合并逻辑正常触发
  • 增加了LocalStorage读取结果的合法性校验,避免空值报错

内容的提问来源于stack exchange,提问作者PHONG VE XUAN BINH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:06:02