js 遍历不规则对象数组并获取树节点路径

假设有这样一个树结构,你现在有id5,如何获取对应的12并组成数组[1,2,5]呢?
在这里插入图片描述
再假设不规则数组如下

var array = [
 { id: 1, name: '买笔', done: true, children: '' },
 { id: 2, name: '买笔记本', done: true, children: [
	   { id: 3, name: '2买笔', done: true },
	   { id: 4, name: '2买笔记本', done: true },
	   { id: 5, name: '2练字', done: false, children: [
		     { id: 7, name: '3买笔', done: true },
		     { id: 8, name: '3买笔记本', done: true },
		     { id: 9, name: '3练字', done: false, children: [
			       { id: 10, name: '4买笔', done: true },
			       { id: 11, name: '4买笔记本', done: true },
			       { id: 12, name: '4练字', done: false }
	     	] }
	   ] }
 ] },
 { id: 6, name: '练字', done: false, children: [
	   { id: 13, name: '5买笔', done: true },
	   { id: 14, name: '5买笔记本', done: true, children: [
		     { id: 16, name: '6买笔', done: true },
		     { id: 17, name: '6买笔记本', done: true },
		     { id: 18, name: '6练字', done: false }
	   ] },
   	   { id: 15, name: '5练字', done: false }
 ] }
]

获取到的id为16,如何获取他的父元素id=14和爷爷元素id=6
解决办法:首先是使用forEach遍历整个数组对象,然后比对id是不是为16,是的话一直回调当前所在对象。就比如id=16,先是回调16所在对象,接下来回调id14所在的对象,最后回调id6所在的对象,这个三个组成一个新的数组,就能生成id16的树节点路径了。

let placeList = []
let num = 0
function traverse(obj, id, callback) {
  for (var a in obj) {
    if (typeof (obj[a]) === 'object') {
      if (obj[a].id == id) {
        placeList[num] = obj[a]
        num++
        callback(obj[a])
        return
      } else if (obj[a]?.length > 0 || obj[a]?.children?.length > 0) {
        traverse(obj[a], id, data => {
          if (typeof (data) === 'object') {
            placeList[num] = obj[a]
            num++
            callback(obj[a])
          }
        }) // 递归遍历
      } else if (obj[a].id == id) {
        placeList[num] = obj[a]
        num++
        callback(obj[a])
        return
        // console.log(a + '=' + JSON.stringify(obj)) // 如果是值就显示
      }
    }
  }
}

递归回调callback回来的是id16所在的分支,placeList 存放的是树节点路径数组,?.符号是最新的es提案可选链,不清楚的可以百度下。

getTreeNode() {
      console.log('---------------------------')
      var array = [
        { id: 1, name: '买笔', done: true, children: '' },
        { id: 2, name: '买笔记本', done: true, children: [
          { id: 3, name: '2买笔', done: true },
          { id: 4, name: '2买笔记本', done: true },
          { id: 5, name: '2练字', done: false, children: [
            { id: 7, name: '3买笔', done: true },
            { id: 8, name: '3买笔记本', done: true },
            { id: 9, name: '3练字', done: false, children: [
              { id: 10, name: '4买笔', done: true },
              { id: 11, name: '4买笔记本', done: true },
              { id: 12, name: '4练字', done: false }
            ] }
          ] }
        ] },
        { id: 6, name: '练字', done: false, children: [
          { id: 13, name: '5买笔', done: true },
          { id: 14, name: '5买笔记本', done: true, children: [
            { id: 16, name: '6买笔', done: true },
            { id: 17, name: '6买笔记本', done: true },
            { id: 18, name: '6练字', done: false }
          ] },
          { id: 15, name: '5练字', done: false }
        ] }
      ]
      // 遍历多维数组
      console.log("开始时间:" + new Date().getTime())
      traverse(array, 16, data => console.log(data))
      console.log("结束时间:" + new Date().getTime())
      console.log(placeList)
    },

最后输出的结果:
树节点路径
再对placeList数组操作下就可以根据区县id获取所在的省市id了,同时遍历不规则数组并获得节点路径也完成了
注意 : 再次遍历时placeList和num一定要重置,不然全局属性可能会隐藏bug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值