类递归循环实现表格目录

实现效果如下


后端数据结构

var res={
  "code": 200,
  "msg": "成功",
  "data": {
    "product": [
      {
        "id": "1",
        "fid": "0",
        "levelName": "产品第一级",
        "companyId": "1",
        "isLeaf": 0,
        "level": 1,
        "innerCategoryList": [
          {
            "id": "3",
            "fid": "1",
            "levelName": "产品第二级2",
            "companyId": "1",
            "isLeaf": 0,
            "level": 2,
            "innerCategoryList": [
              {
                "id": "7",
                "fid": "3",
                "levelName": "产品第三级2",
                "companyId": "1",
                "isLeaf": 0,
                "level": 3,
                "innerCategoryList": [],
                "robotVoList": []
              },
              {
                "id": "20180208141501100005",
                "fid": "3",
                "levelName": "测试添加产品第三级",
                "companyId": "1",
                "isLeaf": 0,
                "level": 2,
                "innerCategoryList": [],
                "robotVoList": [
                  {
                    "robotId": "2",
                    "robotName": "robot"
                  }
                ]
              }
            ],
            "robotVoList": []
          },
          {
            "id": "2",
            "fid": "1",
            "levelName": "产品第二级1",
            "companyId": "1",
            "isLeaf": 0,
            "level": 2,
            "innerCategoryList": [
              {
                "id": "6",
                "fid": "2",
                "levelName": "产品第三级1",
                "companyId": "1",
                "isLeaf": 0,
                "level": 3,
                "innerCategoryList": [],
                "robotVoList": [
                  {
                    "robotId": "5",
                    "robotName": "r-5000"
                  },
                  {
                    "robotId": "4",
                    "robotName": "r-4000"
                  }
                ]
              }
            ],
            "robotVoList": [
              {
                "robotId": "5",
                "robotName": "r-5000"
              },
              {
                "robotId": "4",
                "robotName": "r-4000"
              }
            ]
          },
          {
            "id": "20180209112124100006",
            "fid": "1",
            "levelName": "cccccc",
            "companyId": "1",
            "isLeaf": 0,
            "level": 1,
            "innerCategoryList": [
              {
                "id": "20180209112521100007",
                "fid": "20180209112124100006",
                "levelName": "ccccc3",
                "companyId": "1",
                "isLeaf": 0,
                "level": 2,
                "innerCategoryList": [],
                "robotVoList": []
              }
            ],
            "robotVoList": []
          },
          {
            "id": "5",
            "fid": "1",
            "levelName": "产品第二级4",
            "companyId": "1",
            "isLeaf": 0,
            "level": 2,
            "innerCategoryList": [],
            "robotVoList": []
          },
          {
            "id": "4",
            "fid": "1",
            "levelName": "产品第二级3",
            "companyId": "1",
            "isLeaf": 0,
            "level": 2,
            "innerCategoryList": [
              {
                "id": "8",
                "fid": "4",
                "levelName": "产品第三级3",
                "companyId": "1",
                "isLeaf": 0,
                "level": 3,
                "innerCategoryList": [],
                "robotVoList": []
              },
              {
                "id": "20180206142911100003",
                "fid": "4",
                "levelName": "ceshi004",
                "companyId": "1",
                "isLeaf": 0,
                "level": 2,
                "innerCategoryList": [],
                "robotVoList": []
              }
            ],
            "robotVoList": []
          }
        ],
        "robotVoList": [
          {
            "robotId": "3",
            "robotName": "r-3000"
          }
        ]
      }
    ]
  }

}

前端代码 类递归循环

//递归目录
function categoryDoLoop(firstCategoryData,secondCategoryData,levelOneId,firstCategoryCheck,secondCategoryCheck,thirdCategoryCheck){
    var trElement="";
    var firstRowspan=1;
    var secondRowspan=1;
    var firstCategoryHtml="";
    var secondCategoryHtml="";
    //判断二级目录是否存在
    if(secondCategoryData.length !=0 ){
        //二级目录存在
        for(var i=0;i<secondCategoryData.length;i++){
            //循环二级目录//判断第三级目录是否存在
            var thirdCategory=secondCategoryData[i].innerCategoryList.length;
            thirdCategory==0?thirdCategory=1:thirdCategory;
            firstRowspan+=thirdCategory;
            secondRowspan=thirdCategory;

            if(i==0){
                secondCategoryHtml+=`<td rowspan="${secondRowspan}"><input data-level="2" type="checkbox" class="${secondCategoryCheck}" val="${secondCategoryData[i].id}" data-id="${secondCategoryData[i].id}"/></td><td class="editStyle editBtn" data-level="2" data-levelOneId="${levelOneId}" data-toggle="modal" data-target="#myModal_edit" rowspan="${secondRowspan}" data-id="${secondCategoryData[i].id}">${secondCategoryData[i].levelName}</td>`;
            }else{
                secondCategoryHtml+=`<tr><td rowspan="${secondRowspan}"><input data-level="2" type="checkbox" class="${secondCategoryCheck}" val="${secondCategoryData[i].id}" data-id="${secondCategoryData[i].id}"/></td><td class="editStyle editBtn" data-level="2" data-levelOneId="${levelOneId}" data-toggle="modal" data-target="#myModal_edit" rowspan="${secondRowspan}" data-id="${secondCategoryData[i].id}">${secondCategoryData[i].levelName}</td>`;
            }

            if(secondCategoryData[i].innerCategoryList.length != 0){
                //三级目录存在
                var thirdCategoryData=secondCategoryData[i].innerCategoryList;
                //循环三级目录
                var thirdCategoryHtml="";
                for(var k=0;k<secondCategoryData[i].innerCategoryList.length;k++){
                    if(k==0){
                        thirdCategoryHtml+=`<td><input data-level="3" type="checkbox" class="${thirdCategoryCheck}" val="${thirdCategoryData[k].id}" data-id="${thirdCategoryData[k].id}" data-fid="${thirdCategoryData[k].fid}"/></td><td class="editStyle editBtn" data-level="3" data-levelOneId="${levelOneId}" data-toggle="modal" data-target="#myModal_edit" data-id="${thirdCategoryData[k].id}">${thirdCategoryData[k].levelName}</td>`;
                    }else{
                        thirdCategoryHtml+=`<tr><td><input data-level="3" type="checkbox" class="${thirdCategoryCheck}" val="${thirdCategoryData[k].id}" data-id="${thirdCategoryData[k].id}" data-fid="${thirdCategoryData[k].fid}"/></td><td class="editStyle editBtn" data-level="3" data-levelOneId="${levelOneId}" data-toggle="modal" data-target="#myModal_edit" data-id="${thirdCategoryData[k].id}">${thirdCategoryData[k].levelName}</td></tr>`;
                    }
                }
            }else{
                //三级目录不存在
                thirdCategoryHtml="<td></td><td></td>"
            }
            secondCategoryHtml=secondCategoryHtml+thirdCategoryHtml+"</tr>";
        }
        firstRowspan=Number(firstRowspan)-1;
        firstCategoryHtml=`<tr><td rowspan="${firstRowspan}"><input data-level   ="1" type="checkbox" class="${firstCategoryCheck}" val="${levelOneId}" data-id="${firstCategoryData.id}"/></td><td rowspan="${firstRowspan}" data-id="${levelOneId}">${firstCategoryData.levelName}</td>`;

        trElement=firstCategoryHtml+secondCategoryHtml;
        return trElement;
    }else{
        //二级目录不存在
        firstCategoryHtml=`<tr><td><input data-level="1" type="checkbox" class="${firstCategoryCheck}" val="${levelOneId}" data-id="${firstCategoryData.id}"/></td><td data-id="${levelOneId}">${firstCategoryData.levelName}</td>
<td></td><td></td><td></td><td></td></tr>`;
trElement= firstCategoryHtml; return trElement; }}

渲染到页面

if(res.data.product != undefined){
    //产品信息
    var productSecondCategoryData=res.data.product[0].innerCategoryList;
    var productFirstCategoryData=res.data.product[0];
    var productId=2;
    var firstCategoryCheck="product productFirstCategoryCheck";
    var secondCategoryCheck="product productSecondCategoryCheck";
    var thirdCategoryCheck="product productThirdCategoryCheck";
    var productTr=categoryDoLoop(productFirstCategoryData,productSecondCategoryData,productId,firstCategoryCheck,secondCategoryCheck,thirdCategoryCheck);
    $("#mainTbody").append(productTr);
}

总结:

一级目录固定,rowspan默认为1;

二级目录的合并rowspan是其下三级目录的数组长度+1;

一级目录的合并rowspan是其下所有二级目录的rowspan的和;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQL 递归查询语言主要是通过使用 `WITH RECURSIVE` 关键字来实现的,似于其他数据库管理系统中的 `WITH RECURSIVE` 关键字。 下面是一个使用 MySQL 递归查询语言的例子,假设我们有一个表格 `employee` 包含员工的 ID、姓名和上级 ID: ```sql CREATE TABLE `employee` ( `id` INT NOT NULL, `name` VARCHAR(45) NOT NULL, `manager_id` INT NULL, PRIMARY KEY (`id`) ); INSERT INTO `employee` (`id`, `name`, `manager_id`) VALUES (1, 'Alice', NULL), (2, 'Bob', 1), (3, 'Charlie', 2), (4, 'David', 2), (5, 'Eve', 1), (6, 'Frank', 5), (7, 'Grace', 5), (8, 'Henry', 7); ``` 现在我们想要查询每个员工的直接上级以及所有上级的姓名,可以使用递归查询语言来实现: ```sql WITH RECURSIVE cte (id, name, manager_id, level) AS ( SELECT id, name, manager_id, 0 FROM employee WHERE id = 6 -- 员工 ID UNION ALL SELECT e.id, e.name, e.manager_id, c.level + 1 FROM employee e JOIN cte c ON e.id = c.manager_id ) SELECT CONCAT(REPEAT(' ', level), name) AS name, level FROM cte ORDER BY level; ``` 这个查询语句会输出以下结果: ``` Frank 0 Eve 1 Grace 2 Henry 3 Alice 1 ``` 这个结果表示 Frank 的直接上级是 Eve,Eve 的直接上级是 Alice,而 Grace 和 Henry 是 Eve 的上级,Alice 没有上级。 ### 回答2: MySQL递归查询语言是指在MySQL数据库中使用递归查询来实现对层次结构数据的查询。递归查询可以用于处理带有父子关系的数据,例如组织机构、分目录等。 MySQL递归查询语言的实现方式是通过使用WITH RECURSIVE子句来定义递归查询。这个子句包含两部分:递归部分和终止条件部分。递归部分定义了每一次递归查询时如何从上一次的结果中获取下一级的数据,而终止条件部分定义了递归查询何时停止。 在递归查询中,通过使用UNION操作符将递归部分和终止条件部分连接在一起。递归部分的查询语句中使用了上一次递归查询的结果作为输入,并且在结果中筛选出下一级的数据。终止条件部分的查询语句用于获取最顶层的数据。 递归查询语言的基本语法如下: ``` WITH RECURSIVE cte_name (column1, column2, ...) AS ( SELECT initial_query UNION ALL SELECT recursive_query ) SELECT * FROM cte_name; ``` 递归查询语言的应用场景很多,例如可以用来查询组织机构的层级结构、获取分目录的嵌套关系等。通过递归查询,可以轻松地遍历和操作具有层次结构的数据。 ### 回答3: MySQL并没有专门的递归查询语言。但是可以通过使用存储过程和临时表来实现递归查询。 在MySQL中,可以通过编写存储过程来实现递归查询。存储过程是一种预先编译的SQL语句集合,可以在MySQL数据库上进行执行。在存储过程中,可以使用循环和条件语句来进行递归查询。通过逐步迭代和条件判断,可以实现对具有层级结构的数据进行递归查询。 此外,临时表也是实现递归查询的一种方法。临时表是一种临时存储数据的表,它只存在于当前会话中,并在会话结束后自动被删除。通过创建多个临时表和通过循环插入数据到临时表,可以模拟递归查询的过程。 总的来说,虽然MySQL并没有原生的递归查询语言,但是可以通过存储过程和临时表等方法来实现递归查询。递归查询在处理具有层级结构的数据时非常有用,可以实现对树形结构数据的遍历和查询。但是需要注意的是,递归查询可能会导致性能问题,所以在使用时要谨慎考虑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Irene1991

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值