JS根据子节点递归获取所有父节点的集合

JavaScript019

JS根据子节点递归获取所有父节点的集合,第1张

//传入参数:需要遍历的对象,需要匹配的id,获取所有的父级节点的Id

        function findIdList(data2, id, children = 'children', level = 0) {

  var arrRes = []

  let obj = {

      id: 0,

      [children]: data2

  }

  let rev = (data, id, level) => {

    if (!data || !data[children] || !data[children].length) {

      return

    }

    for (var i = 0 i < data[children].length i++) {

      let item = data[children][i]

      if (item.id == id) {

        // 将匹配到的结果保存到数组

        arrRes.unshift({ level, activeId: item.id })

        // 递归它的父级

        rev(obj, data.id, 0)

        break

      } else if (item[children] && item[children].length > 0) {

        //如果有子集,则把子集作为参数重新执行本方法

        rev(item, id, level + 1)

      }

    }

  }

  rev(obj, id, level)

  return arrRes

}

let list = [

    {id: 1, children: [

        {id: 11, children: [{id: 12}]}

    ]},

    {id: 2, children: [{id:21, children: [{id: 31}]}]}

]

let b = findIdList(list, 21)

console.log(b) // [ { level: 0, activeId: 2 }, { level: 1, activeId: 21 } ]

<div>

<button onclick="dosell(this)">确定</button>

</div>

<script>

function dosell(item){

var parentNode=item.parentNode 

alert(parentNode.tagName) //这里将会弹出DIV

}

</script>

如上,按钮上点击要加一个参数dosell(this)

<body>

  <script>var a = Math.random()</script>

  <div>

    <script>

      //这里的要点是需要获取到当前的script标签

      //或者是这个script标签的父亲(div)

      

      //1 直接获取到div

      var all_div = document.getElementsByTagName('div')

      var div = all_div[all_div.length - 1]

      div.id = a

      //这个是利用了html代码加载执行时的顺序从上到下

      //而在这个script里代码执行的时候恰好解析到

      //最后一个div就是我们想要的div 所以直接查找所有的div

      //然后取最后一个div就是这个标签的父亲(div)

      

      

      //2 获取当前执行的script标签,然后取它的父亲

      function getCurrentScript(){

        if(document.currentScript){

          return document.currentScript

        }

        var scripts = document.getElementsByTagName('script')

        return scripts[scripts.length - 1]

      }

      

      var script = getCurrentScript()

      var div = script.parentNode

      div.id = a

      

      //这个是查找当前正在执行的脚本的标签

      //新版浏览器会有支撑的属性 currentScript

      //旧版本的话,就只好查找所有脚本,然后返回最后一个

      

    </script>

  </div>

</body>