/**
* 获取指定节点的所有子孙节点
* @param {Array} nodes 节点数组
* @param {number|string} id 指定节点 ID
* @returns {Array} 所有子孙节点
*/
function getDescendants(nodes, id) {
// 获取该节点的所有子节点
const childNodes = nodes.filter(n => n.parentId === id);
// 如果没有子节点,则返回空数组
if (childNodes.length === 0) {
return [];
}
// 递归地获取每个子节点的子孙节点,并将它们拼接到当前数组中
return childNodes.concat(
childNodes.map(node => getDescendants(nodes, node.id)).flat()
);
}
这个函数接受两个参数:节点数组 nodes
和指定节点的 id
。它通过过滤出 parentId
等于该节点的 id
的节点来获取该节点的所有子节点,然后判断子节点的数量是否为0,如果是,则返回空数组。
如果有子节点,则对每个子节点递归调用 getDescendants()
函数,并把返回的子孙节点数组与当前节点的子节点数组拼接成一个新的数组。最后返回这个新数组。
map()
方法返回一个新数组,该数组包含了每个子节点的子孙节点数组,然后 flat()
方法把这些数组合并成一个扁平的数组。