一、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;
}
以上代码可以从树形结构中选取符合条件的节点,并返回符合条件的节点数组。 在遍历树形结构时,需要将符合条件的节点放入结果数组中,然后将所有子节点递归遍历,并将其返回的符合条件的节点合并到结果数组中。