实际场景为, 你已经获取到某一个确认的子 id ,想找到其上一级,增加一个对象或者删除一个对象。
直接干代码
var arr =
{
id: 0, name: '000', children:
[
{
id: 1, name: "xhh", children: [
{
id: 11, name: "xx", children: [
{ id: 111, name: "111", children: [] },
{ id: 112, name: "112", children: [] },
{ id: 112, name: "112", children: [] }
]
}
]
},
{
id: 2, name: "xhh", children: [
{
id: 21, name: "21", children: [
{ id: 221, name: "221", children: [] },
{ id: 222, name: "222", children: [] },
{ id: 223, name: "223", children: [] }
]
}
]
},
]
};
//传入参数:需要遍历的json,需要匹配的id
function findParentNode(data, id) {
//设置结果
let result;
if (!data) {
return;//如果data传空,直接返回
}
for (var i = 0; i < data.children.length; i++) {
let item = data.children[i];
if (item.id == id) {
result = data;
return result; //这里是实际返回的值,你可以只返回当前对象,或者指定当前对象的某个字段。
} else if (item.children && item.children.length > 0) {
//如果有子集,则把子集作为参数重新执行本方法
result = findParentNode(item, id);
//关键,千万不要直接return本方法,不然即使没有返回值也会将返回return,导致最外层循环中断,直接返回undefined,要有返回值才return才对
if (result) {
return result;
}
}
}
//如果执行循环中都没有return,则在此return
return result;
}
测试删除当前节点 223 为实际需求已经获取的节点id
var nodeEl = findParentNode(arr, 223);
console.log(nodeEl)
nodeEl.children.forEach((item, index) => {
if (item.id == 223) {
nodeEl.children.splice(index, 1);
}
})
console.log(nodeEl.children) // 这里的元素已经删除了, 并且原数组arr 也删掉了,原理是JS的深浅拷贝。