如何移除含areWeCreatingNewUser属性的对象(旧JS实现)
问题:移除数组中指定属性的元素(旧版JavaScript兼容)
原始对象
const obj = { "title": "sample", "status": 0, "creationDate": null, "userGroup": "", "signatureDelay": "2023-06-05T11:07:18.786Z", "listSign": [], "priority": false, "nature": null, "qesData": { "signatories": [ { "displayName": "Some user", "email": "someuser@hotmail.com", "firstname": "User first name", "id": "4ffb81f6-6efd-4e41-9168-b032ab3e3b04", "lastname": "User last name", "locale": "en", "signatoryAttributes": [] }, { "email": "test@hotmail.com", "displayName": "", "areWeCreatingNewUser": true }, { "email": "test1@hotmail.com", "displayName": "", "areWeCreatingNewUser": true } ] }, "fileName": "sample.pdf", };
需求
遍历obj.qesData.signatories数组,移除所有areWeCreatingNewUser属性为true的对象。
尝试的代码及问题
for(var i = 0;i < obj.qesData.signatories.length;i++) { if(obj.qesData.signatories[i].areWeCreatingNewUser) { obj.qesData.signatories.splice(i,1); } }
这段代码的问题在于:删除第一个符合条件的元素(test@hotmail.com)后,数组长度缩短,后续元素的索引会自动前移。此时循环的i继续递增,会跳过下一个符合条件的元素(test1@hotmail.com),导致无法完全删除目标元素。
限制条件
必须使用旧版JavaScript,filter方法不可用。
解决方案
方法1:倒序遍历数组
从数组末尾开始往前遍历,删除元素时不会影响未遍历的元素索引,避免跳过目标项:
var signatories = obj.qesData.signatories; for (var i = signatories.length - 1; i >= 0; i--) { if (signatories[i].areWeCreatingNewUser) { signatories.splice(i, 1); } }
原理:倒序遍历过程中,当前删除的元素位于已遍历部分的前面,后面未遍历的元素索引不会因删除操作而改变,因此所有符合条件的元素都会被检查到。
方法2:删除元素后回退索引
在删除元素后,将索引i减1,抵消数组长度变化带来的索引偏移:
var signatories = obj.qesData.signatories; for (var i = 0; i < signatories.length; i++) { if (signatories[i].areWeCreatingNewUser) { signatories.splice(i, 1); i--; // 回退索引,确保下一次循环能检查到前移后的元素 } }
原理:删除第i个元素后,后续元素会前移一位,此时i++会跳过新的第i个元素。通过i--,下一次循环的i++会刚好指向这个前移后的元素,保证不遗漏。
内容的提问来源于stack exchange,提问作者Code
相关产品推荐
相关产品推荐

