您的位置:

JS递归遍历树结构详解

一、JS递归遍历树结构并修改

function traverse(node) {
  if(node == null) return; //遍历结束
  node.value++; // 修改当前节点
  traverse(node.left); // 遍历左子树
  traverse(node.right); // 遍历右子树
}

以上代码遍历了一个树形结构,并对每一个节点的value值加1。

在遍历树形结构的过程中,每一个节点可以看作是一颗全新的树,因此,我们可以通过递归的方式在每个节点上重复执行遍历操作。这里需要注意的是,在对一个节点进行某种操作之后,需要继续递归遍历其左右子节点,否则会导致整个树形结构没有完全遍历到。

二、JS递归实现数组转树结构

function arrToTree(arr, pid) {
  let result = [];
  arr.forEach(item => {
    if(item.parentId === pid) {
      item.children = arrToTree(arr, item.id);
      result.push(item);
    }
  });
  return result;
}

以上代码可以将一个带有parentId和id的数组转换成树形结构,parentId为当前节点的父级节点的id,id为当前节点的唯一标识。函数中的arr参数为待转换的数组,pid为当前节点的parentId。

在遍历数组的过程中,识别每个节点的父节点与其他节点的关系,为节点添加children属性,将其转换为树形结构。这里还需要注意的是,函数需要返回生成的树形结构。

三、JS递归遍历树结构删除指定节点

function deleteNode(node, id) {
  if(node === null) return null;
  if(node.id === id) {
    return node.children;
  } else {
    node.children = node.children.map(child => deleteNode(child, id));
  }
  return node;
}

以上代码可以从树形结构中删除指定节点及其所有子节点。

在遍历树形结构的过程中,识别到需要删除的节点时,返回其子节点并赋值给该节点的父节点的children属性,从而删除该节点及其所有子节点。这里需要注意的是,在遍历树形结构时需要保持树形结构不断的完整性。

四、JS递归遍历DOM树

function traverse(el) {
  if(el === null) return; // 遍历结束
  // 对每一个元素进行某种操作
  traverse(el.firstElementChild); // 遍历子元素
  traverse(el.nextElementSibling); // 遍历下一个兄弟元素
}

以上代码可以遍历一个DOM树,对树中的每个元素进行某种操作。

遍历树形结构可以将DOM结构视为一颗树,从而递归的遍历树中的每一个元素。需要注意的是,在遍历DOM树时需要分别遍历其子元素和下一个兄弟元素。

五、JS递归树结构过滤

function filter(tree, func) {
  if(tree == null) return null;
  tree.children = tree.children
    .map(child => filter(child, func))
    .filter(child => child !== null);
  if(func(tree)) {
    return tree;
  } else if(tree.children.length > 0) {
    return {
      ...tree,
      children: tree.children
    };
  } else {
    return null;
  }
}

以上代码可以根据给定的过滤器筛选树形结构中符合条件的节点,并生成一个全新的树形结构。

在树形结构中过滤节点时,需要递归遍历树中的每个节点,进而将每个节点与过滤器进行比较,符合条件的节点需要加入到新生成的树中。需要注意的是,如果某个节点被任意一个子节点保留了,则需要将该节点添加到新生成的树中。

六、JS递归遍历树形结构并修改

function traverse(tree, func) {
  if(tree == null) return null;
  const newTree = func(tree);
  newTree.children = newTree.children.map(child => traverse(child, func));
  return newTree;
}

以上代码可以遍历树形结构并修改节点的属性。

在遍历树形结构时,首先需要对树中的每个节点进行某种操作,操作完成后需要继续递归遍历该节点的子节点,并将其构造为新的树形结构并返回。

七、JS递归生成树形结构

function createTree(data, parentId) {
  let tree = [];
  data.forEach(item => {
    if(item.parentId === parentId) {
      item.children = createTree(data, item.id);
      tree.push(item);
    }
  });
  return tree;
}

以上代码可以首先在数据集中找到根节点,然后递归创建整个树形结构。

在递归生成树形结构的过程中,需要将子节点添加到它的父节点中。如果某个节点不是根节点,则需要查找该节点的父节点并将其添加到父节点的children属性中,递归操作直至所有节点都被遍历到。

八、树结构从里往外遍历JS

function traverse(tree, func) {
  if(tree == null) return;
  const nodes = [tree];
  let node, children;
  while(nodes.length > 0) {
    node = nodes.shift();
    func(node);
    children = node.children || [];
    nodes.unshift(...children);
  }
}

以上代码可以从里往外遍历树形结构(自下而上遍历),并对每个节点进行某种操作。

在从里往外遍历树形结构时,需要使用循环代替递归。在遍历时,需要首先将根节点添加到数组中,然后循环遍历数组中的每个节点,并将其子元素添加到数组的前端,直至数组中所有节点都被遍历到。

九、JS递归遍历多维数组

function flat(arr) {
  let result = [];
  arr.forEach(item => {
    if(Array.isArray(item)) {
      result.push(...flat(item));
    } else {
      result.push(item);
    }
  });
  return result;
}

以上代码可以遍历一个多维数组,将其变为一维数组。

在递归的过程中,需要对数组中的每个元素进行分类,如果是一个数组则需对其递归调用函数进行扁平化处理,如果是其他元素则直接将其添加到结果数组中。

十、JS递归遍历树选取

function select(tree, fn) {
  if(tree == null) return [];
  const children = tree.children || [];
  const result = children
    .map(child => select(child, fn))
    .reduce((acc, val) => acc.concat(val), []);
  if(fn(tree)) {
    result.push(tree);
  }
  return result;
}

以上代码可以从树形结构中选取符合条件的节点,并返回符合条件的节点数组。

在遍历树形结构时,需要将符合条件的节点放入结果数组中,然后将所有子节点递归遍历,并将其返回的符合条件的节点合并到结果数组中。