js通过id匹配树形结构中的一条数据

前端遇到树形结构的数据,格式如下

[
  {
    id: 0,
    label: 'root',
    children: [
      { id: 1, label: '1-1',children: null},
      { id: 2, label: '1-2',children: null},
      { id: 3, label: '1-3',children: null}
    ]
  },
  { id: 20,
    label: 'root1',
    children: [
      { id: 21,
        label: '2-1',
        children: [{
          id: 30,
          label: 'root3',
          children: [
            { id: 31, label: '3-1', children: null},
            { id: 32, label: '3-2', children: null},
            { id: 33, label: '3-3', children: null}
          ]
        }]
      },
      { id: 22, label: '2-2', children: null},
      { id: 23, label: '2-3', children: null}
    ]
  }
]

此时我们根据id查询对应的数据时,可使用以下两种方法:
1、 先扁平化此树形结构,再find找出该id对应是数据

@输入参数 list: 需要扁平化的树形结构数组,默认按children字段扁平展开
@输出:返回别扁平化的数组
function platFn(list) {
  let res = []
  res = list.concat(...list.map(item => {
    if (item.children instanceof Array && item.children.length > 0) {
      return platFn(item.children)
    }
    return null
  }).filter(o => o instanceof Array && o.length > 0))
  return res
}

测试

var platList= platFn(treeList)
console.log(platList)
console.log('id: 32==>', platList.find(item => item.id == 32))

2、直接遍历返回所需数据,找不到则返回null

@输入参数 id: 要查找数据对应的id
@输入参数 list: 要查询的树形结构数组
@输出:返回该数据或null
function findItemById(id, list) {
  let res = list.find(item => item.id == id)
  if (res) {
    return res
  } else {
    for (let i=0; i<list.length; i++) {
      if (list[i].children instanceof Array && list[i].children.length > 0) {
        res = findItemById(id, list[i].children)
        if(res){
          return res
        }
      }
    }
    return null
  }
}

测试

console.log(findItemById(32, treeList))  // {id: 32, label: "3-2", children: null}
console.log(findItemById(43, treeList))  // null
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值