如何使用jQuery在$.each循环中删除cookie对象数组的指定对象
核心需求
从本地Cookie存储的设备信息对象数组中,匹配移除所有和传入deviceId相同的数组项,再将新的设备对象同步写入Cookie,保证数组中仅保留不重复的有效设备条目。
现有代码的问题说明
- 匹配判断存在字段名不一致bug:存储时对象的设备id键是全小写的
deviceid,代码里判断块内修改时混写了大写开头的deviceId,会直接造成逻辑失效 - 错误的“删除”逻辑:代码中通过修改
value对象属性的方式模拟删除,既不会修改原数组结构,也不会把对应条目从数组中移除,最终序列化写入Cookie时完全没有删项效果 - Cookie写入逻辑错误:最后写Cookie时直接把单个新生成的
obj序列化覆盖,会把原数组中所有不匹配的历史设备项全部冲掉,丢失原有存储数据
正确实现方案
实现思路
不建议在正序遍历过程中直接修改原数组结构,避免索引错位漏删;优先通过过滤的方式生成新的保留数组,再追加当前新生成的设备对象,最后把完整数组写回Cookie即可。
代码实现
// 原有业务变量 var deviceId = /* 传入的目标设备ID */; var cookiefull = /* 原有full属性值 */; var istoggle = /* 原有stacked属性值 */; var newDeviceObj = { 'deviceid': deviceId, 'full': cookiefull, 'stacked': istoggle }; // 安全读取并解析Cookie存储的数组 var rawCookieValue = $.cookie("cookieDevObjArray"); var deviceList = rawCookieValue ? $.parseJSON(rawCookieValue) : []; // 方式1:原生filter快速过滤,去掉所有和目标deviceId匹配的项 var validList = deviceList.filter(function(item) { return item.deviceid !== deviceId; }); // 如果你更习惯用$.each遍历,用这种方式收集需要保留的项 /* var validList = []; $.each(deviceList, function(index, item) { if (item.deviceid !== deviceId) { validList.push(item); } }); */ // 把当前新的设备对象追加到有效列表末尾 validList.push(newDeviceObj); // 将处理完成的完整列表写回Cookie $.cookie("cookieDevObjArray", JSON.stringify(validList), { expires: 30 });
注意:如果一定要用
splice方法删除数组项,需要倒序遍历原数组,避免正序删除造成的索引移位、漏删问题。
内容的提问来源于stack exchange,提问作者fazal abbas
相关产品推荐
相关产品推荐

