var data = [ { id: 1, label: "一级 1", children: [ { id: 4, label: "二级 1-1", children: [ { id: 9, label: "三级 1-1-1", children:[], newNode:true }, { id: 10, label: "三级 1-1-2", children:[ { id: 15, label: "三级 1-1-1", children:[] }] }, { id: 11, label: "三级 1-1-2", children:[], newNode:true }, ], }, { id: 3, label: "一级 3", children: [ { id: 7, label: "二级 3-1", children:[], newNode:true }, { id: 8, label: "二级 3-2", children:[] }, ], }, ], }, { id: 2, label: "一级 2", children: [ { id: 5, label: "二级 2-1", children:[] }, { id: 6, label: "二级 2-2", children:[] }, ], },
];
// 方法 // 根据ID获取该节点的所有父节点的对象,第一个是该节点,第二个是直系父结点 export function getParentId(list, value, key = "serialNo") { for (let i in list) { if (list[i][key] == value) { return [list[i]]; } if (list[i].children) { let node = getParentId(list[i].children, value, key = "serialNo"); if (node !== undefined) { return node.concat(list[i]); } } } } // getParentId(data2 ,10); //打印出来就是想要的数据
// 根据ID获取该节点的对象,getid[0]是该结点,[1]是父结点,后面没有了。 export function getId(list, val,key='serialNo') { for (let i in list) { if (list[i][key] == val) { return [list[i]]; } if (list[i].children) { let node = getParentId(list[i].children, val,key); if (node !== undefined) { return node; } } } }
// getId(data2, 4); //打印出来就是想要的数据
// 根据ID获取所有子节点的对象,首先把该节点的对象找出来,上面getId()这个方法
export function getNodeId(list, newNodeId = []) { for (let i in list) { newNodeId.push(list[i]); if (list[i].children) { getNodeId(list[i].children, newNodeId); } } return newNodeId; }
//查找id=4的所有子级节点 //打印出来就是想要的数据 // let objId = getId(data2, 4); // let childId = getNodeId(objId); // 1.1.1=>1.1.2 export function stringToNew(newString) { let originArray = newString.split("."); let temp = parseInt(originArray.pop()) + 1; return ( (originArray.join(".").length ? originArray.join(".")+'.' : "") + temp ); }
export function deleteNodeById(data, val,key = "serialNo") { for (let i = 0; i < data.length; i++) { if (data[i][key] === val) { // 找到匹配的节点,进行删除 data.splice(i, 1); return; } else if (Array.isArray(data[i].children)) { // 递归调用删除函数在子节点中查找 deleteNodeById(data[i].children, val,key = "serialNo");
// 如果删除了节点,需要对结果进行处理
// if (data[i].children.length === 0) {
// delete data[i].children;
// }
}
}
} // 提取直系父结构 export function extractDataById(data, val,key = "serialNo") { for (let i = 0; i < data.length; i++) { if (data[i][key]=== val) { // 找到匹配的节点,返回该节点及其所有父节点 return [data[i]]; } else if (Array.isArray(data[i].children)) { // 递归调用提取函数在子节点中查找 const result = extractDataById(data[i].children, val,key = "serialNo");
if (result.length > 0) {
// 如果在子节点中找到匹配的结果,则将当前节点与子节点结果合并返回
return [{ ...data[i], children: result }];
}
}
}
// 没有找到匹配的节点,返回空数组
return [];
} //要向树形结构中的特定节点children插入一个子节点 export function insertChildById(data, val, newNode,key = "serialNo") { for (let i = 0; i < data.length; i++) { if (data[i][key]=== val && Array.isArray(data[i].children)) { // 找到匹配的节点,将新节点插入它的children数组中 data[i].children.push(newNode); return true; } else if (Array.isArray(data[i].children)) { // 递归调用插入函数在子节点中查找 const inserted = insertChildById(data[i].children, val, newNode,key = "serialNo");
if (inserted) {
// 如果在子节点中插入成功,则返回true
return true;
}
}
}
// 没有找到匹配的节点,返回false
return false;
}