日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法 --- 递归实现多级树展开结构

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法 --- 递归实现多级树展开结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明

  • 先根據數據渲染,然后再實現事件

渲染

  • 在項目中,經常會給出一個深度不確定的數組,數字結構如下:
data = [{name: 'a', child:[{name: 'a1'},{name: 'a2', child: [{name:'a21'}]}]},{name: 'b'} ]
  • 要求將數組渲染成對應的目錄結構, 結構如下:
<ul><li>a<ul><li>a1</li><li>a2<ul><li>a21</li></ul></li></ul></li><li>b</li> </ul>
  • 思路,先對數組中的第一級數據顯示出來
$(function(){var str = '<ul>';for(var i=0; i< data.length; i++){str += `<li>${data[i].name}</li>`}str += '</ul>';$('.tree').html(str) })

此時頁面結構如下:

  • 下面嘗試將頁面結構渲染成如下
<div class="tree"><ul><li>a<ul><li>a1</li><li>a2</li></ul></li> <li>b</li></ul> </div>
  • 嘗試寫第二級元素.
// 首先判斷第一級是否含有第二級元素 if(data[i].child){var str = '<ul>';for(let var j =0; i<data.[i].child.length; j++){str += `<li>${data[i].child[j].name}</li>`}str += "</ul>";$('ul').html(str) }
  • 可以發現.第二級的過程和第一級的過程是一樣的.因此嘗試使用遞歸如下:
$(function(){function f(data){var str = '<ul>'for(let i =0; i<data.length; i++){if(data[i].child){// 含有孩子元素, 應該渲染成 <ul><li>a<ul><li>a1</li></ul></li></ul>的結構str += `<li>${data[i].name}`str += f(data[i].child)str += "</li>"} else {str += `<li>${data[i].name}</li>`}}str += "</ul>"return str}$(".lists").html(f(data)) })

  • 完成

添加事件

  • 有時候左邊的導航欄需要可以點擊…
  • 即,點擊左側的按鈕, 導航欄可以進行收縮…
  • 實現很簡單.
  • 在每個li下面添加一個span標簽,利用jQuery的隱式迭代規則,給每個span標簽添加一個點擊事件.當鼠標點擊上去的時候,判斷當前span元素的兄弟元素是否有子元素
  • 如果有就證明當前是可以展開的,否則不能展開
  • 如果可以展開,則獲取span中的內容.如果是-, 則將其變為+并隱藏它的兄弟元素,
  • 如果是+,則當前的span變為-,并顯示其兄弟元素.

你可能用到的API

  • 監聽類tree下所有span的點擊事件
  • 獲取當前被點擊的對象
#('.tree li span').click(function(){// 獲取當前被點擊的對象console.log($(this)) })
  • 獲取當前元素的兄弟元素ul
  • 判斷該兄弟元素(ul)是否為空
$(this).siblings('ul') if(this.siblings('ul').length == 0){console.log('不能展開') } else{console.log('可以展開'); }
  • 改變當前span中的內容
if($(this).html() == '-'){$(this).html('+') } else {$(this).html('-') }

總體代碼

  • 樣式代碼
ul li span {display: inline-block;width: 15px;height: 15px;color: red;margin-right: 10px;border: 1px solid #1890ff;line-height: 15px;text-align: center;vertical-align: middle;border-radius: 50%;cursor: default; }li {list-style-type: none; }li span:hover{cursor: pointer; }
  • html代碼
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><title>無限級目錄樹</title><link rel="stylesheet" href="public/css/15.css" /><script type="text/javascript" src="public/js/jquery.min.js"></script></head><body><div class="tree"></div><script type="text/javascript" src="public/js/15.js"></script></body> </html>
  • js代碼
data = [{name: 'a', child:[{name: 'a1'},{name: 'a2', child: [{name:'a21'}]},{name: 'a3', child: [{name: 'a31'},{name: 'a32'},{name: 'a33'},{name: 'a34', child: [{name: 'a341'},{name: 'a342'},{name: 'a343'},{name: 'a344'}]}]}]},{name: 'b'},{name: 'c'} ] $(function() {function g(data) {var str = '<ul>'for (var i = 0; i < data.length; i++) {if (data[i].child) {str += `<li><span>-</span>${data[i].name}`str += g(data[i].child);str += "</li>"} else {str += `<li><span>-</span>${data[i].name}</li>`}}str += '</ul>'return str}// 渲染dom結構$('.tree').html(g(data))// 渲染完成后,給li下面的span添加點擊事件$('.tree li span').click(function(){if($(this).siblings('ul').length >0){console.log('可以展開')if($(this).html() == '-'){$(this).html('+')$(this).siblings('ul').hide()} else {$(this).html('-');$(this).siblings('ul').show();}} else {console.log('不能展開')}})})

參考

源代碼

總結

以上是生活随笔為你收集整理的算法 --- 递归实现多级树展开结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。