原生js求DOM树的最大深度

如何用原生js求DOM树的最大深度?

阅读 7.9k
3 个回答
var maxDepth = 0
function elementList(el,depth) {
    console.log(depth);
    maxDepth = depth
    for(var i=0; i<el.children.length; i++) {
        elementList(el.children[i],depth+1);
    }
}
elementList(document.getElementById('domId'),0);
console.log(maxDepth)
function getMaxDomTreeDepth_recursive(domRoot) {
                var childrenDepth = [],
                    child = domRoot.firstChild;
                if (!child) {
                    return 1;
                }
                while (child) {
                    childrenDepth.push(getMaxDomTreeDepth_recursive(child));
                    child = child.nextSibling;
                }
                console.log(childrenDepth)
                return Math.max(...childrenDepth) + 1;
            }

递归实现

我利用了 dom 节点的 children 属性 来遍历和递归

递归套路是: 返回 (1 + 子节点们深度的最大值)

// map(e => e + 1)([0, 1, 2]) 
// => 1, 2, 3 
// 类似于数组的map方法 不过这里柯里化了 
var map = cb => arr => Array.prototype.map.call(arr, cb); 

// 取数组最大值 
// max([0, 1, 2])
// => 2 
var max = arr => arr.reduce((acc, cur) => {
    if (cur >= acc) return cur; 
    else return acc; 
}, arr[0]); 

// 递归函数 
var nextChildren = node => {
    // 基准条件 
    if (node.children.length === 0) return 1; 
    else {
        // 求子节点们的长度 并取最大值 
        var deeps = map(nextChildren)(node.children); 
        
        return 1 + max(deeps); 
    }
}

// 计算 
var $body = document.getElementsByTagName('body')[0];
var deep = nextChildren($body); 
console.log(deep); 

ScreenShot

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题