2017-06-01
算法
递归 DOM树 得到深度
问题是这样的:
用原生js求DOM树的最大深度?
好吧 这是我在 SegmentFault 上答的题目

# 递归

我利用了 DOM 节点的 children 属性 来遍历和递归, children 代表子节点,是一个 类数组对象 因此常规的数组方法用不了,得自行封装。 (其实是不想写 for
我的递归套路是:
叶子节点返回 1; 非叶子节点返回 (1 + 子节点们深度的最大值)

# 工具

刚刚提到了,children 属性是类数组对象,因此常规的数组方法不能用,要自己封装。
00// map(e => e + 1)([0, 1, 2]) 
01// => 1, 2, 3 
02// 类似于数组的map方法 不过这里柯里化了 
03var map = cb => arr => Array.prototype.map.call(arr, cb); 
04
05// 取数组最大值 
06// max([0, 1, 2])
07// => 2 
08var max = arr => arr.reduce((acc, cur) => {
09    if (cur >= acc) return cur; 
10    else return acc; 
11}, arr[0]);
执行 map(e => e + 1)([0, 1, 2]) 返回 [1, 2, 3]
执行 max([0, 1, 2]) 返回 2

# 实现

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

# 测试

先写一个测试函数,输入选择器,返回所有符合选择器节点们的深度。
00var getDeep = sel => {
01    let arr = document.querySelectorAll(sel);
02
03    return map(nextChildren)(arr); 
04}
对我的博客做了测试:
首先是 getDeep('body') 结果是 [8]
再来是 .md 元素 结果是 [5, 4]
最后再看看 <html> (结果应该是 body 的基础上 + 1)
结果是 [9] 确实如此。
再测了侧 <footer> 结果是 [3] 打开浏览器自己看了看确实是 3
结果
结果
nextChildren 还是挺可靠的。

# Links





回到顶部