JavaScript递归删除含__deleteConditions:true的对象及子对象
递归过滤带有
__deleteConditions: true的对象数组 你可以通过递归遍历数组的每一层,筛选掉__deleteConditions为true的对象,同时对每个保留对象的items子数组做同样的递归处理,实现需求。
实现代码
function filterDeleteConditions(items) { // 过滤当前层级的对象,排除__deleteConditions为true的项 return items.filter(item => { // 直接剔除标记为删除的对象 if (item.__deleteConditions === true) { return false; } // 如果当前对象包含子items数组,递归处理子层级 if (item.items && Array.isArray(item.items)) { item.items = filterDeleteConditions(item.items); } // 保留符合条件的对象 return true; }); } // 测试用的原数组 const originalArray = [ { "fieldID": 10, "isGroup": true, "itemDisplayName": "Cliente", "items": [ { "fieldID": 1, "isGroup": false, "itemDisplayName": "Código cliente", "items": [], "__deleteConditions": false }, { "fieldID": 2, "isGroup": false, "itemDisplayName": "Apellidos", "items": [], "__deleteConditions": true } ] }, { "fieldID": 20, "isGroup": true, "itemDisplayName": "Aseguradora", "items": [ { "fieldID": 3, "isGroup": false, "itemDisplayName": "Código", "items": [ { "fieldID": 4, "isGroup": false, "itemDisplayName": "Id", "items": [ { "fieldID": 5, "isGroup": false, "itemDisplayName": "Numerical", "items": [], "__deleteConditions": true }, { "fieldID": 7, "isGroup": false, "itemDisplayName": "Numerical2", "items": [], "__deleteConditions": false } ], "__deleteConditions": false }, { "fieldID": 6, "isGroup": false, "itemDisplayName": "Apellidos", "items": [], "__deleteConditions": true } ], "__deleteConditions": false } ] } ]; // 执行过滤 const filteredArray = filterDeleteConditions(originalArray); console.log(filteredArray);
代码逻辑说明
- 层级筛选:使用
Array.filter遍历当前层级的对象,直接排除__deleteConditions为true的项; - 递归处理子项:对于每个保留的对象,检查是否存在
items子数组,若存在则递归调用过滤函数,更新该对象的items属性; - 保留合法对象:所有未标记删除、且完成子项过滤的对象会被保留并返回。
如果需要避免修改原数组,可以在过滤前对原数组做深拷贝:
const copiedArray = JSON.parse(JSON.stringify(originalArray)); const filteredArray = filterDeleteConditions(copiedArray);
内容的提问来源于stack exchange,提问作者Stella Esparza
相关产品推荐
相关产品推荐

