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

JavaScript中如何避免向localStorage存储的数组数据出现重复项?

问题根因
  • 核心问题是你用Array.includes()判断对象类型的video是否重复:JS中引用类型的相等判断是对比内存地址,哪怕两个video的内容完全一致,只要是不同的对象实例,includes永远返回false,去重逻辑完全失效
  • 冗余操作:你已经尝试读取了一次存储数据,后续又调用ls.get('list')二次读取,不仅多余还可能出现取值不一致的问题
  • 参数浪费:你入参传入了id字段但完全没有用到,视频数据的唯一id才是最可靠的去重判断依据
修复后的代码
const WishlistHandler = (video, id) => {
  console.log({ video, id })
  // 只读取一次本地存储的列表数据,空值直接兜底为空数组
  const itemGet = ls.get('list') || []
  // 用唯一id判断是否已存在,规避引用类型判断失效的问题
  const isExist = itemGet.some(item => item.id === id)
  if (!isExist) {
    const newList = [...itemGet, video]
    ls.set('list', newList)
    SetWishList(newList)
  } else {
    console.log("该视频已存在于心愿单")
  }
}
关键修改说明
  • 统一只读取一次localStorage数据,空值直接兜底为数组,简化了多分支判断逻辑
  • 用视频唯一id作为去重判断依据,通过Array.some()遍历匹配,只要列表里有相同id的项就判定为重复,完全解决了引用类型比较失效的问题
  • 合并了空列表和已有列表的分支逻辑,代码更简洁,也避免不同分支逻辑不一致的隐性bug
  • 新增重复提示,方便调试排查问题

额外优化点:如果你的video对象本身就携带id属性,还可以直接删掉入参里的id,判断条件改成item.id === video.id即可,代码更精简。

内容的提问来源于stack exchange,提问作者Ayomikun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:18:01