新闻中心

从 localStorage 中删除数组中指定项的教程

2025-11-25
浏览次数:
返回列表

从 localStorage 中删除数组中指定项的教程

本文详细介绍了如何在 `localstorage` 中存储的数组对象中,准确删除特定项目。核心问题在于 j*ascript 中严格相等运算符 `!==` 与数据类型不匹配时导致的删除失败。教程将分析问题根源,并提供两种解决方案:使用非严格相等运算符 `!=`,以及更推荐的显式类型转换方法,确保比较的准确性与代码的健壮性。

在 localStorage 数组中删除指定项

在 Web 开发中,localStorage 是一个常用的客户端存储机制,用于持久化少量数据。当我们需要存储一组结构化数据(如购物车商品列表、用户配置项等)时,通常会将其序列化为 JSON 字符串并存储。从这些数组中删除特定项目是常见的操作,但如果不注意细节,可能会遇到意想不到的问题。

考虑一个典型场景:我们将一个商品列表存储在 localStorage 中,其中每个商品都是一个包含 item_id、item_name 和 qty 等属性的对象。当用户希望从列表中删除某个商品时,我们需要根据其 item_id 来定位并移除。

常见问题分析:严格相等与类型不匹配

假设 localStorage 中存储的数据结构如下,其中 key 是 emp_id,对应的值是一个商品数组:

// localStorage key: "189"
[
  {"item_id":"50","item_name":"Delivery T-Shirt Medium danger","qty":1},
  {"item_id":"49","item_name":"Delivery T-Shirt Small danger","qty":"1"},
  {"item_id":"51","item_name":"Delivery T-Shirt Large danger","qty":"1"},
  {"item_id":"11","item_name":"Bread Pant 30 white","qty":"1"}
]

为了实现删除功能,我们可能会编写一个类似以下的函数:

function Deleteitem(emp_id, item_id_to_delete) {
  var itemDetails = localStorage.getItem(emp_id);

  if (itemDetails) {
    itemDetails = JSON.parse(itemDetails);

    // 尝试过滤掉要删除的项
    itemDetails = itemDetails.filter(function(item) {
      return item.item_id !== item_id_to_delete; // 核心比较逻辑
    });

    localStorage.setItem(emp_id, JSON.stringify(itemDetails));
  }

  // 假设有一个函数用于更新显示
  displayItemDetails();
}

这段代码的逻辑看起来很合理:获取数据、解析 JSON、使用 filter 方法遍历数组,当 item.item_id 与 item_id_to_delete 不相等时保留该项。然而,如果 item_id_to_delete 的数据类型与 item.item_id 在数组中的数据类型不一致,并且使用了严格不相等运算符 !==,那么删除操作将可能失败。

例如,在上述示例数据中,item.item_id 的值如 "50"、"49" 都是字符串类型。如果 item_id_to_delete 是一个数字类型(例如 50),那么 50 !== "50" 的结果将是 true,因为 !== 会同时比较值和类型。这意味着即使值相同,但类型不同,该项也不会被过滤掉,从而导致删除失败。

解决方案

解决这个问题主要有两种方法:

方案一:使用非严格相等运算符 !=

非严格相等运算符 != 在比较时会尝试进行类型转换。这意味着 50 != "50" 的结果是 false,因为 J*aScript 会将字符串 "50" 转换为数字 50 再进行比较。

修改 Deleteitem 函数中的比较逻辑如下:

云网OA 云网OA

采用JSP开发的办公自动化产品、基于B/S结构,运行环境:JDK v1.5、Tomcat v5.5、MySQL v4.1,三者均为以上版本其他相关内容:可视化流程设计: 流程支持串签、会签和分支流程,可以设置流程节点的修改、删除权限,并可指定流程中各个用户在表单中可以填写的域。智能表单所见即所得设计: 智能设计,自动在数据库中生成表格,方便优化程序 公共交流: 集论坛、博客、聊天室于一体文件柜:C

云网OA 0 查看详情 云网OA
function Deleteitem(emp_id, item_id_to_delete) {
  var itemDetails = localStorage.getItem(emp_id);

  if (itemDetails) {
    itemDetails = JSON.parse(itemDetails);

    itemDetails = itemDetails.filter(function(item) {
      // 使用非严格不相等运算符
      return item.item_id != item_id_to_delete;
    });

    localStorage.setItem(emp_id, JSON.stringify(itemDetails));
  }

  displayItemDetails();
}

注意事项: 这种方法简单直接,但在某些情况下,非严格相等可能会导致一些意料之外的类型转换行为,例如 0 == false 会返回 true。因此,虽然它能解决当前问题,但并非总是最推荐的方案,尤其是在需要精确控制类型匹配的场景。

方案二:显式进行类型转换(推荐)

更健壮和推荐的做法是,在进行比较之前,显式地将其中一个操作数转换为与另一个操作数相同的类型。这样可以避免 != 运算符可能带来的隐式类型转换问题,使代码更具可读性和可预测性。

通常,我们会将外部传入的 item_id_to_delete 转换为与 localStorage 中存储的 item.item_id 相同的类型。根据示例数据,item.item_id 是字符串,因此我们将 item_id_to_delete 也转换为字符串。

function Deleteitem(emp_id, item_id_to_delete) {
  var itemDetails = localStorage.getItem(emp_id);

  if (itemDetails) {
    itemDetails = JSON.parse(itemDetails);

    // 将 item_id_to_delete 显式转换为字符串类型
    const target_item_id_str = String(item_id_to_delete);

    itemDetails = itemDetails.filter(function(item) {
      // 使用严格不相等运算符进行比较,确保类型一致
      return item.item_id !== target_item_id_str;
    });

    localStorage.setItem(emp_id, JSON.stringify(itemDetails));
  }

  displayItemDetails();
}

反之,如果 localStorage 中的 item.item_id 存储的是数字类型(例如 50),而传入的 item_id_to_delete 可能是字符串(例如 "50"),则应该将 item.item_id 或 item_id_to_delete 转换为数字进行比较:

// 假设 item.item_id 在 localStorage 中是数字类型
// itemDetails = itemDetails.filter(function(item) {
//   return Number(item.item_id) !== Number(item_id_to_delete);
// });

最佳实践: 保持数据类型的一致性是减少这类错误的关键。在将数据存入 localStorage 之前,就应该确保其格式符合预期。例如,如果 item_id 总是数字,那么在存储前就应该将其转换为数字,或者在从 localStorage 读取后立即进行类型转换。

总结

在从 localStorage 中存储的数组对象中删除特定项目时,务必注意比较操作中数据类型的一致性。使用严格相等运算符 !== 进行比较时,如果操作数的类型不匹配,即使值相同,比较结果也会是 true,从而导致删除失败。

推荐的做法是,在比较之前显式地将操作数转换为相同的类型(例如,都转换为字符串或都转换为数字),然后再使用严格相等或不相等运算符进行比较。这样可以提高代码的健壮性、可读性和可维护性,避免因隐式类型转换带来的潜在问题。

以上就是从 localStorage 中删除数组中指定项的教程的详细内容,更多请关注其它相关文章!


# 数据结构  # 产品类网站建设方案  # 营销推广哪家比较好点呢  # seo教程网app  # 如何做营销推广易速达  # 网站按词优化怎么写  # 泰兴推广网站  # 烟台芝罘关键词排名工具  # seo流量 sem流量全称  # 手机网站建设基础  # 嘉兴网站建设价位表报价  # 不相等  # 云网  # 都是  # javascript  # 如何使用  # 隐式  # 是一个  # 组中  # 运算符  # 转换为  # 隐式类型转换  # 常见问题  # ai  # json  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  蛙漫2台版漫画地址 Manwa2正版网页版链接  实现分段式页面滚动导航:CSS与J*aScript教程  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  顺丰快递查询系统 官方正版查询入口  Tabulator表格中精确实现日期时间排序的指南  微信客户端如何收红包_微信客户端接收红包使用教程  SteamMachine定价或为699美元 大家想入手吗?  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  c++ dfs和bfs代码 c++深度广度优先搜索算法  在哪找SublimeJ远程工具_SFTP插件配置教程  Python多版本共存与虚拟环境管理深度指南  fishbowl官网免费版 fishbowl养鱼网站入口  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  J*aScript中安全有效地处理localStorage字符串数据  J*aScript:在map操作中高效处理空数组  必由学网页版入口 必由学官方平台直接访问  yy漫画网页版官方入口_yy漫画官网登录页面链接  利用Bokeh CustomJS动态控制DataTable列可见性  Win10双系统截图高效法 截屏快捷键速记【技巧】  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  Python自定义类排序:解决lambda键值访问TypeError的实践指南  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  免费抖音短视频入口_抖音网页版短视频免费通道  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  4399免费游戏网址入口 4399小游戏免费入口点开即玩  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  Log4j Console Appender性能瓶颈与高并发优化策略  AO3最新入口2025公告_AO3中文官网合集  2026春节假期票务安排_2026春节放假购票指南  零跑汽车11月交付量达70327台 实现连续9个月正增长  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  美团外卖商家服务中心入口 美团商家版官网入口  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  最新韩小圈网页版登录入口_官网在线观看官方链接  Fabric模组开发:自定义物品与物品组的现代管理方法  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析 

搜索