股墓山庄

专注于AS3,JavaScript 每天一点进步,坚持...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

递归树,并形成新的树结构

Posted on 2020-05-26 14:14  股墓山庄庄主  阅读(345)  评论(0编辑  收藏  举报
 const result = this.deal(this.data.getWorkListArrOld, node => node.label.indexOf(e.detail.value)!=-1);

    console.log(JSON.stringify(result, null, 4));

/**
 * 递归过滤节点,生成新的树结构
 * @param {Node[]} nodes 要过滤的节点
 * @param {node => boolean} predicate 过滤条件,符合条件的节点保留
 * @return 过滤后的节点
 */
deal(nodes, predicate) {
  // 如果已经没有节点了,结束递归
  if (!(nodes && nodes.length)) {
      return;
  }

  const newChildren = [];
  for (const node of nodes) {
      if (predicate(node)) {
          // 如果自己(节点)符合条件,直接加入到新的节点集
          newChildren.push(node);
          // 并接着处理其 children
          node.children = this.deal(node.children, predicate);
      } else {
          // 如果自己不符合条件,需要根据子集来判断它是否将其加入新节点集
          // 根据递归调用 deal() 的返回值来判断
          const subs = this.deal(node.children, predicate);

          // 以下两个条件任何一个成立,当前节点都应该加入到新子节点集中
        // 1. 子孙节点中存在符合条件的,即 subs 数组中有值
        // 2. 自己本身符合条件
        if ((subs && subs.length) || predicate(node)) {
            node.children = subs;
            newChildren.push(node);
        }
          /* if (subs && subs.length) {
              // 1. 如果子孙集中有符合要求的节点(返回 [...]),加入
              node.children = subs;
              newChildren.push(node);
          } */
          // 2. 否则,不加入(因为整个子集都没有符合条件的)
      }
  }
  return newChildren.length ? newChildren : void 0;
},

  该 效果为搜索树并形成新的树,来源于网上资料。