如何在嵌套对象数组中删除指定ID的对象及其子项?
如何根据ID删除嵌套数组中的对象及其子项?
我有一个包含嵌套数组和对象的结构,需要根据指定ID删除对应的对象及其所有子项。比如要删除ID为30的对象,最终结果里不能再出现该对象和它的子元素。
原始数据
let data= [{"name": "Corporate","id": 1,"editMode": true,"children": [{"name": "Banner","id": 2,"parentId": 1,"editMode": true,"children": [{"name": "Division","id": 3,"parentId": 2,"editMode": false,"children": [{"name": "Region","id": 4,"editMode": true,"children": [{"name": "District","id": 5,"editMode": true,"children": [{"name": "Store","id": 6,"editMode": false,"children": []}]}]}]},{"name": "Banner1","id": 30,"editMode": true,"children": [{"name": "Banner11","id": 35,"editMode": true,"children": []}]},{"name": "Banner1","id": 31,"editMode": true,"children": []},{"name": "Banner1","id": 32,"editMode": true,"children": [{"name": "Banner11","id": 33,"editMode": true,"children": []},{"name": "Banner11","id": 34,"editMode": true,"children": []}]}]},{"name": "Corporate1","id": 36,"editMode": true,"children": [{"name": "Corporate11","id": 38,"editMode": true,"children": []},{"name": "Corporate11","id": 39,"editMode": true,"children": []}]},{"name": "Corporate1","id": 37,"editMode": true,"children": []}]}];
现有代码(已找到目标对象但不知如何删除)
let data= [{"name": "Corporate","id": 1,"editMode": true,"children": [{"name": "Banner","id": 2,"parentId": 1,"editMode": true,"children": [{"name": "Division","id": 3,"parentId": 2,"editMode": false,"children": [{"name": "Region","id": 4,"editMode": true,"children": [{"name": "District","id": 5,"editMode": true,"children": [{"name": "Store","id": 6,"editMode": false,"children": []}]}]}]},{"name": "Banner1","id": 30,"editMode": true,"children": [{"name": "Banner11","id": 35,"editMode": true,"children": []}]},{"name": "Banner1","id": 31,"editMode": true,"children": []},{"name": "Banner1","id": 32,"editMode": true,"children": [{"name": "Banner11","id": 33,"editMode": true,"children": []},{"name": "Banner11","id": 34,"editMode": true,"children": []}]}]},{"name": "Corporate1","id": 36,"editMode": true,"children": [{"name": "Corporate11","id": 38,"editMode": true,"children": []},{"name": "Corporate11","id": 39,"editMode": true,"children": []}]},{"name": "Corporate1","id": 37,"editMode": true,"children": []}]}]; console.log(findNestedObj(data, 'id', 30)); function findNestedObj(entireObj, keyToFind, valToFind) { let foundObj; JSON.stringify(entireObj, (_, nestedValue) => { if (nestedValue && nestedValue[keyToFind] === valToFind) { foundObj = nestedValue; } return nestedValue; }); return foundObj; };
解决方案
直接递归遍历数组,过滤掉目标ID的对象,同时对每个保留的对象递归处理其children数组,这样就能彻底移除目标对象及其所有子项。
实现代码
function removeNestedItem(arr, targetId) { return arr.filter(item => { // 如果当前项是目标ID,直接过滤掉 if (item.id === targetId) { return false; } // 如果有children,递归处理子数组 if (item.children && item.children.length > 0) { item.children = removeNestedItem(item.children, targetId); } return true; }); } // 使用示例 const updatedData = removeNestedItem(data, 30); console.log(updatedData);
代码说明
- 用
filter方法遍历数组,直接排除目标ID对应的对象; - 对每个保留的对象,检查是否存在
children数组,若存在则递归调用处理函数,确保子层级中也移除目标ID的对象; - 最终返回的数组即为移除了目标对象及其所有子项的结果。
内容的提问来源于stack exchange,提问作者vamsi sai
相关产品推荐
相关产品推荐

