首页  >  问答  >  正文

javascript - 遍历dom节点,将其转换为一个数组,并且将层次越深的排在越前面,怎么实现?

如题,从一个node节点开始向下遍历,直至遍历完所有节点,将层次最深的节点排在最前面,将这些节点转换为一个数组,如何实现?

高洛峰高洛峰2695 天前748

全部回复(1)我来回复

  • 仅有的幸福

    仅有的幸福2017-06-26 10:53:49

    递归遍历孩子,按底向上、左到右顺序

    function listNode (node) {
      if (!(node instanceof Node)) {
        throw new TypeError("parameter 1 is not of type 'Node'")
      }
      return Array.from(node.childNodes || [])
        .reduce((cList, cNode) => cList.concat(listNode(cNode)), [])
        .concat([node])
    }

    补:按底向上、左到右顺序并不一定是层次最深的排前面。可以用层序遍历倒过来记录:

    function listNode (rootNode) {
      if (!(rootNode instanceof Node)) {
        throw new TypeError("parameter 1 is not of type 'Node'")
      }
      var queue = [rootNode, null]
      var levelNodes = []
      var result = []
    
      while (queue.length > 1) {
        var node = queue.shift()
        if (node === null) {
          queue.push(null)
          result = levelNodes.concat(result)
          levelNodes = []
          continue
        }
        
        levelNodes.push(node)
        if (node.hasChildNodes()) {
          queue = queue.concat(Array.from(node.childNodes))
        }
      }
      
      if (levelNodes.length > 0) {
        result = levelNodes.concat(result)
      }
      
      return result
    }

    回复
    0
  • 取消回复