js遍历树形结构方法

let nodeList = [
    {id: '1-1', children: [{id: '1-2-1'}, {id: '1-2-2'}]},
    {id: '2-1'},
    {id: '3-1', children: [{id: '3-2-1', children: [{id: '3-3-1'}]}]}

这个方法比较常见,第一点就是你需要用额外的变量保存最后的结果,第二点就是可递归的条件是当前访问节点具有子节点,nodeList的children属性便是记录了子节点数据,我们不仅要判断children是否存在,还得判断children的长度是否为空。在函数中写上默认值是一个比较好的习惯,因为你无法保证别人在使用你方法的时候会不会给你传值,同时可以保证你函数的健壮性。
方法二:利用generator 函数返回的遍历器

function* gen (nodes = []) {
  for (let item of nodes) {
      yield item.id
      if (item.children && item.children.length) yield* gen(item.children)
  }
}

这个方法虽然也用到了递归,但相比方法二显得更加的简洁,易读。方法二的核心有三点,第一点是generator函数(生成器函数)的返回结果是一个遍历器,遍历器可以被扩展运算符(…),for … of…,Array.from, 解构赋值等访问, 通常我们都会输出数组。第二点是紧跟yield的值会被当成遍历结果输出,例如这里的item.id,当我们用for…of…去遍历的时候,遍历的就是item.id。第三点就是在生成器函数中访问生成器函数并期望他可以正常被遍历访问的时候必须用yield* ,如上图的yield* readNodes(item.children), 不然的话直接使用readNodes(item.children),将会导致item.children并不会被遍历到。

element-tree获取选中和半选中状态的数据

this.$refs.tree.getCheckedNodes().concat(this.$refs.tree.getHalfCheckedNodes())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值