博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript实现DOM树的深度优先遍历和广度优先遍历
阅读量:4082 次
发布时间:2019-05-25

本文共 1978 字,大约阅读时间需要 6 分钟。

// 深度遍历
function interator(node) {
    console.log(node);
    if (node.children.length) {
        for (var i = 0; i < node.children.length; i++) {
            interator(node.children[i]);
        }
    }
}

// 广度遍历

function interator(node) {

    var arr = [];

    arr.push(node);
    while (arr.length > 0) {
        node = arr.shift();
        console.log(node);
        if (node.children.length) {
            for (var i = 0; i < node.children.length; i++) {
                arr.push(node.children[i]);
            }
        }
    }
}
————————————————

深度优先遍历

// 非递归,首次传入的node值为DOM树中的根元素点,即html
// 调用:deep(document.documentElement)
function deep (node) {
  var res = []; // 存储访问过的节点
  if (node != null) {
    var nodeList = []; // 存储需要被访问的节点
    nodeList.push(node);
    while (nodeList.length > 0) {
      var currentNode = nodeList.pop(); // 当前正在被访问的节点
      res.push(currentNode);
      var childrens = currentNode.children;
      for (var i = childrens.length - 1; i >= 0; i--) {
        nodeList.push(childrens[i]);
      }
    }
  }
  return res;
}

// 使用递归

var res = []; // 存储已经访问过的节点
function deep (node) {
  if (node != null) { // 该节点存在
    res.push(node);
    // 使用childrens变量存储node.children,提升性能,不使用node.children.length,从而不必在for循环遍历时每次都去获取子元素
    for (var i = 0,  childrens = node.children; i < childrens.length; i++) {
      deep(childrens[i]);
    }
  }
  return res;
}
广度优先遍历
// 递归
var res = [];
function wide (node) {
  if (res.indexOf(node) === -1) {
    res.push(node); // 存入根节点
  }
  var childrens = node.children;
  for (var i = 0; i < childrens.length; i++) {
    if (childrens[i] != null) {
      res.push(childrens[i]); // 存入当前节点的所有子元素
    }
  }
  for (var j = 0; j < childrens.length; j++) {
    wide(childrens[j]); // 对每个子元素递归
  }
  return res;
}

// 非递归

function wide (node) {
  var res = [];
  var nodeList = []; // 存储需要被访问的节点
  nodeList.push(node);
  while (nodeList.length > 0) {
    var currentNode = nodeList.shift(0);
    res.push(currentNode);
    for (var i = 0, childrens = currentNode.children; i < childrens.length; i++) {
      nodeList.push(childrens[i]);
    }   
  }
  return res;
}
 

————————————————

版权声明:本文为CSDN博主「qinchao888」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/GreyBearChao/article/details/82872441

你可能感兴趣的文章
和koa不同的express是怎么实现
查看>>
koa源码解读
查看>>
Vue知识点(面试)
查看>>
学习webpack4的配置更改
查看>>
js方法封装
查看>>
vue常见面试问题收藏
查看>>
前端工程师面试题(性能优化)
查看>>
如何在移动端设置1px的border
查看>>
基于vue-cli3.0构建功能完善的前端架子
查看>>
vue 插件集合
查看>>
Object.defineProperty方法
查看>>
前端之vue面试题
查看>>
前端面试总结(题目+答案)
查看>>
如何在vue中判断用户是否登录,登录权限
查看>>
Vue.js面试题整理
查看>>
Vuex入门
查看>>
详解Vue路由钩子及应用场景
查看>>
使用Webpack的代码分离实现Vue懒加载(译文)
查看>>
H5获取用户位置API + 百度地图API介绍
查看>>
Vue—知识点整理
查看>>