前后端三层双层(多层)树形结构处理

it2023-07-11  70

前后端树形结构处理----设计理念

相信有许多人曾被树形结构处理从而困扰过下面我就为大家分享一下,在工作中!常见的树形结构该怎么处理!

场景

首先肯定有三个数据 这里我就分为 大主题(第一层数据),小主题(第二层数据),商品(第三层数据) 这里就列举为三层数据吧!其实你搞懂了三层数据处理后,在多也是一样的!

首先你要知道三层数据肯定是有所关联的

那到底是咋样关联的呢?

其实懂点后端的伙伴!肯定知道是通过字段id关联的!

(1)假设大主题 总共有四条如下

(后端同理就当下面下面数据为查出数据)

let bigCommodityData = [ { id:1, name:"大主题1" }, { id:2, name:"大主题2" }, { id:3, name:"大主题3" }, { id:4, name:"大主题4" } ]

小主题是绑定在大主题上的,通过大主题的id小主题的每条数据可以增加字段对其进行绑定这里就以pid为例!假设pid:1就是绑定在大主题的第一条数据上的

(2)假设小主题 总共有8条如下

let smallCommodityData = [ { id:1, name:"小主题1", pid:1, sid:"0_0", }, { id:2, name:"小主题2", pid:1, sid:"0_1", }, { id:3, name:"小主题3", pid:2, sid:"1_0", }, { id:4, name:"小主题4", pid:2, sid:"1_1", }, { id:5, name:"小主题5", pid:3, sid:"2_0", }, { id:6, name:"小主题6", pid:3, sid:"2_1", }, { id:7, name:"小主题7", pid:4, sid:"3_0", }, { id:8, name:"小主题8", pid:4, sid:"3_1", }, ]

这样就把小主题绑定在了大主题了上了 细心的小伙伴会发现字段sid是干嘛的?对的其实它就是我们用来绑定商品的sid:"0_0"前面的0就代表在第一个大主题上后面的0是代表商品绑定在小主题的第一个上(这里相对商品而言的)!

(3)假设商品总共有8条如下

let goodsData = [ { id:1, name:"商品1", cid:"0_0", }, { id:2, name:"商品2", cid:"0_1" }, { id:3, name:"商品3", cid:"1_0", }, { id:4, name:"商品4", cid:"1_1", }, { id:5, name:"商品5", pid:4, cid:"2_0", }, { id:6, name:"商品6", pid:3, cid:"2_1", }, { id:7, name:"商品7", pid:4, cid:"3_0", }, { id:8, name:"商品7", pid:4, cid:"3_1", }, ]

这样其实就绑定好了!这些就是树型结构的设计理念

树形结构的数据处理

现在我们要把数据给前端反出去!或者有的(坑比后端,不过关的后端)不会处理这种树形结构!会直接扔给前端让前端处理!再或者基于需求这种结构只能分开反!但前端有的时候合并该怎么办呢?

其实很简单我们直接来硬货!嵌套循环这样就可以了(三层for循环)!

话不多说直接上代码! 如有不能理解的 请私聊我!我经常是这样处理的!或者大家有更好的方案更快捷的处理方式欢迎您的留言

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> </body> </html> <script> // 小主题数据 // SELECT id,name,sid,pid,name,subhead,img_url_grey,img_url_pink FROM pandora_small_themes ORDER BY sid , gmt_modified DESC // 大主题数据 // SELECT id,name,title,slogan,poster_slogan FROM pandora_big_themes // 首饰项链数据 // SELECT id,cid,item_id,sku,prize,url,name,name_detail,detail_url,diy_url,width,height,order_url,material,color,theme FROM pandora_goods ORDER BY cid ,priority, gmt_modified DESC let smallCommodityData = [ { id:1, name:"小主题1", pid:1, sid:"0_0", }, { id:2, name:"小主题2", pid:1, sid:"0_1", }, { id:3, name:"小主题3", pid:2, sid:"1_0", }, { id:4, name:"小主题4", pid:2, sid:"1_1", }, { id:5, name:"小主题5", pid:3, sid:"2_0", }, { id:6, name:"小主题6", pid:3, sid:"2_1", }, { id:7, name:"小主题7", pid:4, sid:"3_0", }, { id:8, name:"小主题8", pid:4, sid:"3_1", }, ] let bigCommodityData = [ { id:1, name:"大主题1" }, { id:2, name:"大主题2" }, { id:3, name:"大主题3" }, { id:4, name:"大主题4" } ] let goodsData = [ { id:1, name:"商品1", cid:"0_0", }, { id:2, name:"商品2", cid:"0_1" }, { id:3, name:"商品3", cid:"1_0", }, { id:4, name:"商品4", cid:"1_1", }, { id:5, name:"商品5", pid:4, cid:"2_0", }, { id:6, name:"商品6", pid:3, cid:"2_1", }, { id:7, name:"商品7", pid:4, cid:"3_0", }, { id:8, name:"商品7", pid:4, cid:"3_1", }, ] let array = []; for (let i = 0; i < bigCommodityData.length; i++) { let array1 = bigCommodityData[i]; array1.children = []; array1.level = 1; array1.id = array1.id + ''; array.push(array1); for (let j = 0; j < smallCommodityData.length; j++) { if (bigCommodityData[i].id == smallCommodityData[j].pid) { let array2 = smallCommodityData[j]; array2.children = []; array2.level = 2; array2.id = array2.id + ''; array1.children.push(array2); for (let k = 0; k < goodsData.length; k++) { if (goodsData[k].cid == smallCommodityData[j].sid) { let array3 = goodsData[k]; array3.level = 3; array3.id = array3.id + ''; array2.children.push(array3); } } } } } console.log(array); </script>

双层数据结构处理

/** * 二维数组数据处理格式 * 默认盒子宽度indexWidth 为900,默认margin为28,数据为每一个元素的宽度,若元素宽度相加并且加上每个元素的margin 总宽度大于900并入一个新数组 * 理想格式[[],[],[],[]] */ var data = [{ id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }, { id: 1, width: 76, }, { id: 2, width: 50, }, { id: 3, width: 70, }]; console.log(data.length); let newArray = []; let finallyArray = []; let indexWidth = 900; let indexMargin = 28; let boxLength = 0; for (let i = 0; i < data.length; i++) { boxLength += data[i].width; if (boxLength > 900) { finallyArray.push(newArray); boxLength = 0; newArray = []; } newArray.push(data[i]); if (i == data.length - 1) { finallyArray.push(newArray); } } console.log(finallyArray);
最新回复(0)