精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用遞歸遍歷并轉換樹形數據(以TypeScript為例)

開發 前端
樹形數據的遍歷有兩種方法,大家都知道:廣度遍歷和深度遍歷。一般情況下,廣度遍歷是采用隊列來實現,而深度遍歷剛更適合使用遞歸來實現。

一個朋友問我應該怎么從一個樹的 JSON 數組生成 HTML,使用 <ul> 和 <li> 來構建頁面元素。于是我簡單的畫了個樹型結構圖

 

然后寫了對應的模擬數據(JavaScript 對象)

  1. const data = { 
  2.     name"A"
  3.     nodes: [ 
  4.         { name"B", nodes: [{ name"F" }] }, 
  5.         { name"C" }, 
  6.         { 
  7.             name"D"
  8.             nodes: [ 
  9.                 { name"G" }, 
  10.                 { name"H" }, 
  11.                 { name"I", nodes: [{ name"J" }, { name"K" }] } 
  12.             ] 
  13.         }, 
  14.         { name"E" } 
  15.     ] 
  16. };  

***寫了一個遞歸,生成了 HTML 的樹型結構。原本是用 JavaScript ES6 寫的,為了表明數據結構,這里改用 TypeScript 來寫:

  1. interface INode { 
  2.     name: string; 
  3.     nodes?: INode[]; 
  4.  
  5. function makeTree(roots: INode[]): JQuery<HTMLElement> { 
  6.     function makeNode(node: INode): JQuery<HTMLElement> { 
  7.         const $div = $("<div>").text(node.name || ""); 
  8.         const $li = $("<li>").append($div); 
  9.         if (node.nodes && node.nodes.length) { 
  10.             $li.append(makeNodeList(node.nodes)); 
  11.         } 
  12.         return $li; 
  13.     } 
  14.  
  15.     function makeNodeList(nodes: INode[]): JQuery<HTMLElement> { 
  16.         return nodes 
  17.             .map(child => makeNode(child)) 
  18.             .reduce(($ul, $li) => { 
  19.                 return $ul.append($li); 
  20.             }, $("<ul>")); 
  21.     } 
  22.  
  23.     return makeNodeList(roots); 
  24.  

效果還是蠻不錯的

 

看看源碼(轉譯成 JS 之后的):http://jsfiddle.net/y7bw4yj2/

然后朋友說沒看明白,好吧,那我從頭講起

遍歷方法

樹形數據的遍歷有兩種方法,大家都知道:廣度遍歷和深度遍歷。一般情況下,廣度遍歷是采用隊列來實現,而深度遍歷剛更適合使用遞歸來實現。

 

廣度遍歷

從圖上大致可以理解廣度遍歷的過程:

  1. 準備一個空隊列;
  2. 將根(單根或多根均可)節點放到隊列中;
  3. 從隊列中取出一個節點
  4. 處理(比如打印)這個節點
  5. 檢查節點的子節點,如果有,全部依次添加到隊列中
  6. 回到第 3 步開始處理,直到隊列為空(處理完成)
  1. function travelWidely(roots: INode[]) { 
  2.     const queue: INode[] = [...roots]; 
  3.     while (queue.length) { 
  4.         const node = queue.shift()!; 
  5.         // 打印節點名稱及其子節點數 
  6.         console.log(`${node.name} ${node.nodes && node.nodes.length || ""}`); 
  7.         if (node.nodes && node.nodes.length) { 
  8.             queue.push(...node.nodes); 
  9.         } 
  10.     } 
  11.  
  12. // 開始遍歷 
  13. travelWidely([data]);  

const node = queue.shift()!,這后面的 ! 后綴表示聲明其結果不為 undefined 或 null。這是一個 TypeScript 語法。由于 .shift() 在數組中沒有元素時會返回 undefined,所以其返回類型被聲明為 INode | undefined,由于從邏輯可以保證 .shift() 一定會返回一個節點對象,所以這里用 ! 后綴忽略類型中的 undefined 部分,使 node 的類型被推導為 INode。

代碼里稍難理解一點的是要注意 queue 的內容和長度隨時在變化。如果想使用 for 代替 while 循環,節點序號會因 .shift() 而不斷變化,所以 i < queue.length 這樣的判斷是錯誤的。

深度遍歷

深度遍歷是一個遞歸過程,遞歸一直是編程的難點。

遞歸是一個循環往復的處理過程,它有兩個點需要注意:

  • 遞歸調用點,遞歸調用自己(或另一個可能會調用自己的函數)
  • 遞歸結束點,退出當前函數

以樹節點為例,我們期望處理過程是處理(打印)一個樹結點,即 printNode(node: INode)。那么它的

  • 遞歸調用點:如果該節點有子節點,依次對子節點調用 printNode(children[i])
  • 遞歸結束點:處理完所有子節點(子節點數量是有限的,所以一定會結束)

用一段偽代碼描述這一過程

  1. function printNode(node: INode) { 
  2.     // 處理該節點 
  3.     console.log(node.name); 
  4.      
  5.     // 遞歸調用點:循環對子節點調用 printNode 
  6.     node.nodes!.forEach(child => printNode(child)); 
  7.      
  8.     // 遞歸結束點:循環完成,return 
  9.  

上面兩句代碼就完成了遞歸過程,但實際上情況還要復雜些,因為要處理入口和容錯。

  1. // 注意參數支持傳入單根或多根, 
  2. // 如果像 travelWidely 那樣只支持多根(單根是特例)也是可以的 
  3. function travelDeeply(roots: INode | INode[]) { 
  4.     function printNode(node: INode) { 
  5.         console.log(`${node.name} ${node.nodes && node.nodes.length || ""}`); 
  6.         if (node.nodes && node.nodes.length) { 
  7.             // 依次對子節點遞歸調用 printNode 
  8.             node.nodes.forEach(child => printNode(child)); 
  9.         } 
  10.     } 
  11.  
  12.     // 這里 printNode 和 node => printNode(node) 等價 
  13.     (Array.isArray(roots) ? roots : [roots]).forEach(printNode); 
  14.  
  15. // 開始遍歷 
  16. travelDeeply(data);  

關于遞歸,我正好在慕課網上講生成數據解決方案的時候講到了,有興趣可以看看。

遍歷還沒講完

上面兩種遍歷都講到了,但是還沒講完——因為兩種遍歷都是以打印為例,而我們的目的是要生成 DOM 樹。生成 DOM 樹與純打印信息的不同之處在于,我們不僅要使用節點信息,還要從節點信息生成 DOM 返回出來。

深度遍歷生成節點

這次先講深度遍歷,因為遞歸更容易實現。遞歸本身具有層次信息,每進入一個遞歸調用點,就會深入一層,每離開一個遞歸結束點,就會減少一層。所以這個算法本身能夠保留結構信息,相應代碼也會更容易實現。而且在本文一開始,就已經實現出來了。

需要注意的一點是那段代碼用了兩個函數來完成遞歸過程:

  • makeNode 處理單個節點,它調用 makeNodeList 處理子節點列表
  • makeNodeList 遍歷節點列表,分別對其調用 makeNode 來進行處理

makeNode 和 makeNodeList 的相互調用形成了遞歸,上述兩條都是遞歸調用點,而遞歸結束點同樣也有兩條:

  • makeNode 處理的節點沒有子節點時,不會調用 makeNodeList
  • makeNodeList 中的循環結束時,不會再調用 makeNode

廣度遍歷生成節點

廣度遍歷的過程是把所有節點扁平化到一個隊列中了,這個過程是不可逆 的,換句話說,我們在處理過程中丟掉了樹形結構信息。然后我們要生成的 DOM 樹,是需要結構信息的——因此,需要將結構信息附加在每個節點上。這里我們把生成的 DOM 和數據節點綁定起來,由 DOM 保存結構信息。為此,需要修改一下節點類型

  1. interface INode { 
  2.     name: string; 
  3.     nodes?: INode[]; 
  4.     dom: JQuery;    // 附加生成的 DOM 
  5.  
  1. function makeTreeWidely(roots: INode[]): JQuery { 
  2.     // 從一組節點生成 <ul>,為每個節點生成并附加 <li>, 
  3.     // 同時將 <li> 到到 <ul> 中保存結構信息 
  4.     function makeUl(nodes: INode[]) { 
  5.         return nodes 
  6.             .map(node => { 
  7.                 const $li = $("<li>"
  8.                     .append($("<div>").text(node.name || "")); 
  9.                 node.dom = $li; 
  10.                 return $li; 
  11.             }) 
  12.             .reduce(($ul, $li) => $ul.append($li), $("<ul>")); 
  13.     } 
  14.  
  15.     const $rootUl = makeUl(roots); 
  16.  
  17.     const queue: INode[] = [...roots]; 
  18.     while (queue.length) { 
  19.         const node = queue.shift()!; 
  20.  
  21.         if (node.nodes && node.nodes.length) { 
  22.             const $ul = makeUl(node.nodes); 
  23.             node.dom.append($ul); 
  24.             queue.push(...node.nodes); 
  25.         } 
  26.     } 
  27.     return $rootUl; 
  28.  

雖然這里和上面講遞歸遍歷 printNode 的時候一樣定義了局部函數表達式 makeUl,但這里沒有遞歸,因為 makeUl 內部沒有調用自身,或者某個會調用 makeUl 的函數。

但問題還是再深入一點,因為上面的代碼改變了原數據。而一般情況下,我們應該盡量避免這樣的副作用

沒有副作用的廣度遍歷生成節點

  1. // 聲明一個新結構,它把 INode 和 DOM 組合在一起。 
  2. // 這個結構將代替 INode 作為隊列的元素類型 
  3. interface IDomNode { 
  4.     node: INode; 
  5.     dom: JQuery; 
  6.  
  7. function makeTreeWidely(roots: INode[]): JQuery { 
  8.     // convert 將節點數組轉換為 IDomNode 數組, 
  9.     // 同時還干了原來 makeUl 干的事情,返回一個 $ul 
  10.     function convert(nodes: INode[]) { 
  11.         const domNodes = nodes 
  12.             .map(node => { 
  13.                 const $li = $("<li>"
  14.                     .append($("<div>").text(node.name || "")); 
  15.                 return { 
  16.                     node, 
  17.                     dom: $li 
  18.                 }; 
  19.             }); 
  20.  
  21.         const $ul = domNodes 
  22.             .reduce(($ul, dn) => $ul.append(dn.dom), $("<ul>")); 
  23.  
  24.         // 將兩個數組組成一個元組(對象)返回 
  25.         return { 
  26.             domNodes, 
  27.             $ul 
  28.         }; 
  29.     } 
  30.  
  31.     // 解析元組,聲明變量 queue 和 $rootUl, 
  32.     // 并分別將 domNodes 和 $ul 的值賦值給 queue 和 $rootUl 兩個變量 
  33.     const { domNodes: queue, $ul: $rootUl } = convert(roots); 
  34.  
  35.     while (queue.length) { 
  36.         const { node, dom } = queue.shift()!; 
  37.  
  38.         if (node.nodes && node.nodes.length) { 
  39.             const { domNodes, $ul } = convert(node.nodes); 
  40.             dom.append($ul); 
  41.             queue.push(...domNodes); 
  42.         } 
  43.     } 
  44.     return $rootUl; 
  45.  

看療效:http://jsfiddle.net/y7bw4yj2/1/

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2022-01-10 12:23:00

TypeScript ESLint前端

2011-07-08 09:55:02

數據中心防震

2021-08-02 09:50:47

Vetur源碼SMART

2011-08-04 09:57:03

dbmonsterMySQL

2016-12-20 12:34:46

存儲MySQL流程

2018-08-22 16:40:51

前端JavascriptVue

2021-05-31 08:00:00

消息隊列架構Rabbit MQ

2023-06-26 08:43:57

OracleTRACE葉節點

2020-03-03 09:17:27

圖形數據庫數據庫

2018-01-02 09:00:51

大數據營銷王者榮耀

2022-10-14 08:03:46

圖形數據庫系統

2009-03-02 16:57:34

LinuxUbuntu配置完全方案

2021-01-14 09:00:00

開發FedoraUbuntu

2022-02-14 14:28:57

驅動開發鴻蒙系統

2021-04-16 08:20:00

Flink CEP直播監控

2025-05-13 08:09:56

2020-03-06 10:05:15

2025-04-07 08:40:00

Python數據結構

2010-09-07 10:01:47

網游服務器搭建方案

2015-05-07 11:24:13

DockerIT技術評價新技術
點贊
收藏

51CTO技術棧公眾號

亚洲精品系列| 91麻豆精品国产91久久综合| 欧美人与动牲性行为| 老色鬼精品视频在线观看播放| 神马国产精品影院av| 亚洲精品中文字幕乱码无线| 色呦呦在线视频| fc2成人免费人成在线观看播放| 奇米成人av国产一区二区三区| 一区二区三区伦理片| 成人黄色免费网站| 亚洲在线观看免费视频| 日本精品视频一区| 亚洲av无码一区二区乱子伦| 久久aⅴ乱码一区二区三区| 亚洲精品美女在线观看| 欧美富婆性猛交| 亚洲自拍偷拍视频| 国产精品美女久久久久av爽| 欧美激情影院| 欧美日韩一区二区三区免费看| 欧美乱做爰xxxⅹ久久久| 二区在线观看| 99麻豆久久久国产精品免费优播| 91精品国产综合久久香蕉922| 久久夜靖品2区| 久久综合99| 亚洲国产精久久久久久| 一级黄色片国产| 三上悠亚国产精品一区二区三区| 亚洲天堂中文字幕| 性色av一区二区三区红粉影视| 精品人妻一区二区三区四区| 久久精品九色| 欧美性猛交xxxx黑人交| 国产深夜男女无套内射| 超碰在线caoporn| 国产日韩欧美一区二区三区综合| 亚洲jizzjizz日本少妇| 凹凸精品一区二区三区| 一本久道综合久久精品| 久久福利网址导航| 国产肥白大熟妇bbbb视频| 久久一级大片| 欧美四级电影在线观看| avav在线播放| 伊人手机在线| 国产精品久久久久久久久久免费看 | 国产精品免费大片| 精品中文视频在线| 免费a级黄色片| 精品人人人人| 日韩你懂的在线观看| 欧美激情第四页| 欧美日韩卡一| 亚洲日本免费电影| 中文字幕久久午夜不卡| 日本视频一区二区不卡| 黄色影院在线播放| 国产欧美精品一区aⅴ影院 | 欧美在线色图| 精品性高朝久久久久久久| 一起草在线视频| 另类ts人妖一区二区三区| 精品国产成人系列| 在线观看国产免费视频| 国产乱人伦精品一区| 欧美成人福利视频| 911亚洲精选| 日韩大胆成人| 日韩电影网在线| 人妻少妇无码精品视频区| 精品资源在线| 精品久久久网站| 极品白嫩丰满美女无套| 女人丝袜激情亚洲| 亚洲桃花岛网站| 国产 欧美 在线| 欧美高清在线| 美女999久久久精品视频| a资源在线观看| 亚洲最大av| 性欧美xxxx交| 天干夜夜爽爽日日日日| 日韩成人午夜精品| 国产精品美乳一区二区免费 | 亚洲国产成人精品久久久国产成人一区| www.51色.com| 欧美激情网址| 日韩亚洲第一页| 国产无遮挡又黄又爽| 国产一区二区三区久久久久久久久| 国产mv久久久| 91成人国产综合久久精品| 美美哒免费高清在线观看视频一区二区 | xxxx另类黑人| 国产亚洲制服色| 亚洲国产精品影视| 国产污视频在线播放| 色偷偷一区二区三区| 国产情侣av自拍| h1515四虎成人| 精品久久久久久亚洲综合网| 亚洲日本精品视频| 欧美精品一卡| 欧美性资源免费| 精品国产乱码一区二区三 | 中文字幕第28页| 男男视频亚洲欧美| 国产91视觉| 国产露出视频在线观看| 亚洲综合一区二区三区| aⅴ在线免费观看| 一区二区三区免费在线看| 亚洲欧美制服另类日韩| 亚洲不卡在线播放| 日韩二区三区四区| 99re在线| 国产调教视频在线观看| 色www精品视频在线观看| 亚洲五月激情网| 欧美一二区在线观看| 91av在线播放视频| 亚洲国产日韩在线观看| 亚洲特级片在线| 妓院一钑片免看黄大片| 欧美日韩大片免费观看| 另类美女黄大片| 日本成人一级片| 成人国产精品免费观看动漫| 国产日韩第一页| 精品久久福利| 亚洲最新中文字幕| 国产一级片毛片| 波多野结衣视频一区| www.69av| 久久视频社区| 九九视频这里只有精品| 国产午夜精品在线| 亚洲天堂中文网| 国产日韩av一区| 欧美日韩dvd| 欧美影院视频| 欧美裸体xxxx极品少妇| 国产富婆一级全黄大片| 国产精品久久久久影院| 久久久久久久久久久视频| 精品资源在线| 91国语精品自产拍在线观看性色| 噜噜噜久久,亚洲精品国产品| 亚洲精品第1页| 日本xxxx免费| 国户精品久久久久久久久久久不卡| 国产女精品视频网站免费| a黄色在线观看| 欧美天堂亚洲电影院在线播放| 一级在线观看视频| 久久成人18免费观看| 在线观看精品视频| 成人污版视频| 欧美伦理91i| 四虎永久在线精品免费网址| 欧美日韩人人澡狠狠躁视频| 亚洲成年人av| 国产精品一卡| 日韩影片在线播放| 草莓视频成人appios| 色偷偷91综合久久噜噜| av高清一区二区| 亚洲成人av一区| 国产女主播喷水高潮网红在线| 日本在线不卡一区| 伊人久久大香线蕉综合75| 国产精品日韩精品在线播放 | 亚洲www免费| 中文一区二区视频| 亚洲无码精品在线观看| 亚洲激情网站免费观看| 国产成人精品一区二区三区在线观看| 亚洲激情黄色| 日韩精品无码一区二区三区| 欧美视频在线视频精品| 最近2019中文免费高清视频观看www99| 一个人看的www日本高清视频| 一区二区三区蜜桃| 亚洲欧美中文日韩在线| 中国极品少妇xxxx| 天堂蜜桃一区二区三区| 制服诱惑一区| 久久久久久毛片免费看| 国产精品久久久久久久久免费 | 久久99视频免费| 亚洲欧美日韩免费| 欧美性高清videossexo| 久草视频免费在线播放| 国产午夜一区二区三区| 爱情岛论坛亚洲自拍| 欧美专区一区二区三区| 日韩视频一二三| 欧美激情网址| **亚洲第一综合导航网站| 久久久久久久| 欧美黑人一级爽快片淫片高清| 免费在线高清av| 欧日韩精品视频| 日本天堂网在线观看| 中文字幕在线不卡| 国产精品1000部啪视频| 国产大陆a不卡| 2022亚洲天堂| 欧美精品国产| 亚洲一区bb| 网曝91综合精品门事件在线| 91手机在线视频| 男人亚洲天堂| 国产成人综合亚洲| h片在线观看下载| 久久国产精品久久久久久久久久| 国产一二在线观看| 亚洲精品福利视频| 精品国产黄色片| 欧美精品乱码久久久久久按摩| 日韩av大片在线观看| 亚洲一区精品在线| 欧美一区二区三区爽爽爽| www.一区二区| 99riav国产精品视频| 国内精品伊人久久久久影院对白| 日本女优爱爱视频| 日韩午夜免费视频| 曰韩不卡视频| 国产精品99久久| 五月天色一区| www.丝袜精品| 国产在线观看一区二区三区 | 户外极限露出调教在线视频| 精品国产一区二区三区av性色| 91精品国自产| 在线精品视频一区二区三四| 亚洲婷婷综合网| 大荫蒂欧美视频另类xxxx| 国产乡下妇女做爰毛片| 一区二区三区欧美在线观看| 国内偷拍精品视频| 亚洲另类色综合网站| 国产精品丝袜一区二区| 国产精品沙发午睡系列990531| 人人妻人人澡人人爽人人精品| 成人久久久精品乱码一区二区三区| 婷婷激情5月天| 国产一区二区在线观看免费| 一级黄色高清视频| 久久99国产精品成人| 男人插女人下面免费视频| 国产午夜精品一区二区三区欧美 | 国产在线视视频有精品| 在线a免费观看| 狠狠色丁香九九婷婷综合五月| 色诱视频在线观看| 免费精品视频在线| 人人爽人人av| 麻豆精品新av中文字幕| 在线看的黄色网址| 国产裸体歌舞团一区二区| 蜜桃视频无码区在线观看| 成人动漫一区二区三区| zjzjzjzjzj亚洲女人| 91原创在线视频| 91l九色lporny| 中文字幕一区二区三区色视频| 欧美激情视频二区| 一区二区三区成人| 成人免费看片98欧美| 欧美性猛交xxxx乱大交退制版 | 国产.欧美.日韩| 中文字幕线观看| 成人综合婷婷国产精品久久蜜臀| 一边摸一边做爽的视频17国产 | 国产精品日本一区二区| 牛牛影视久久网| 日韩免费三级| 香蕉视频国产精品| 桥本有菜av在线| 亚洲一区区二区| 国产精品久久久久9999小说| 蜜臀av一区二区在线观看| 制服丝袜亚洲精品中文字幕| 中文字幕在线观看视频网站| 色综合天天综合狠狠| 91极品身材尤物theporn| 欧美精品一区二区在线播放| 国产高清免费av在线| 色妞一区二区三区| 特级毛片在线| 国产精品极品美女在线观看免费| 久久av偷拍| 色就是色欧美| 亚洲国产二区| 久久久久久综合网| 久久综合九色综合欧美亚洲| 久久中文免费视频| 亚洲国产精品久久一线不卡| 中文字幕日韩国产| 亚洲精品乱码久久久久久按摩观| 麻豆视频在线观看免费| 7777免费精品视频| 精品视频在线播放一区二区三区 | 伊人春色精品| 一区二区视频在线免费| 在线精品在线| 日韩精品aaa| 欧美国产精品中文字幕| 五月天综合在线| 成人国产精品一级毛片视频| 亚洲精品在线免费| 亚洲一级特黄| 中文字幕第66页| 中国色在线观看另类| av资源免费观看| 欧美草草影院在线视频| 欧美成人hd| 欧美综合国产精品久久丁香| 在线精品自拍| 欧美日韩一区二区三区电影| 蜜桃av噜噜一区二区三区小说| 熟女丰满老熟女熟妇| 亚洲一区免费在线观看| 亚洲视频久久久| 亚洲天堂免费视频| 中文在线资源| 久久国产精品-国产精品| 一本一本久久a久久综合精品| 日韩精品无码一区二区三区免费| 国产曰批免费观看久久久| 精品女人久久久| 欧美日韩一区二区在线观看视频 | 国产一区二区三区视频在线观看| 国内激情视频在线观看| 91免费欧美精品| 伊人色**天天综合婷婷| 日韩av自拍偷拍| 亚洲视频一区在线观看| 国产女主播喷水视频在线观看 | 免费在线观看av片| 毛片av一区二区| 欧美性猛交久久久乱大交小说| 91免费小视频| 亚洲欧美偷拍视频| 亚洲最新av在线网站| 91p九色成人| 午夜精品美女久久久久av福利| 日韩电影在线免费观看| 波多野结衣 在线| 在线免费观看日本一区| aaa在线观看| 亚洲18私人小影院| 亚洲成aⅴ人片久久青草影院| 日韩中文字幕二区| 国产色综合一区| 亚洲男人天堂网址| 一区二区欧美久久| 福利一区二区免费视频| av不卡在线免费观看| 高清在线观看日韩| 日韩欧美一区二区一幕| 亚洲国产成人在线视频| 97se综合| 手机成人av在线| 国产剧情一区在线| 青青草原在线免费观看| 欧美精品一区二区三区蜜桃 | 荫蒂被男人添免费视频| 疯狂欧美牲乱大交777| 成年人在线观看视频| 国产日韩欧美自拍| 欧美+亚洲+精品+三区| 潘金莲一级淫片aaaaa| 亚洲国产成人高清精品| 牛牛澡牛牛爽一区二区| 国产欧美日韩中文字幕在线| 日韩久久电影| 国产人妻精品午夜福利免费| 欧美性猛交xxxx偷拍洗澡 | 性欧美办公室18xxxxhd| 欧美猛男做受videos| 拔插拔插华人永久免费| 亚洲成人一二三| 精品美女视频在线观看免费软件| 国产视频999| 国产主播一区| 在线观看av中文字幕| 欧美视频一区二| 丁香高清在线观看完整电影视频| 日本一区二区久久精品| 国产精品系列在线播放| 中文字幕xxxx| 久久久久久久久久久久久久久久久久av | 欧美精品久久久久性色| 日韩av在线影院| 欧美日一区二区三区|