为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2018-11-12 17:13:12
如题,从一个node节点开始向下遍历,直至遍历完所有节点,将层次最深的节点排在最前面,将这些节点转换为一个数组,如何实现?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

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

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

}


查看完整回答
反对 回复 2018-12-25
  • 1 回答
  • 0 关注
  • 560 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信