开发者对复杂的数据结构的处理能力也是体现开发者水平的一个度量吧…最近发现自己对一些嵌套数据结构,层级数据结构的处理能力不大足…经常被这些把自己绕晕…严重影响开发效率,就稍微低总结了一下下…
<强>一,mongodb设计层级关系数据(这里主要说的是猫鼬)强>
首先,我们知道,普通的一对多的关系,可以通过引用,填充操作找出相应的引用对象,如:
var essaySchema=新猫鼬。模式({//文章模式 用户:{ 类型:mongoose.Schema.Types。ObjectId,//发布者的引用 裁判:“用户”,//引用自用户模型 要求:真//非空 }, … });
文章与评论的关系,就是一对多。自然也是按照这种处理方式即可。
但是,评论与回复的关系,就有点意思了。首先,评论和回复,回复与该回复的回复虽然是不同的东西(看着就拗口),但是这些的示玛的信息都是由相同的字段构成。也就是说,可以说是自己嵌套了多个自己。
这个时候,就要这样处理了:
//评论模式定义 var commentSchema=new mongoose.Schema ({ 内容:{ 类型:字符串, 要求:真 }, 创建:{ 类型:日期, “默认”:Date.now }, 用户:{ 类型:mongoose.Schema.Types。ObjectId,//用户的引用 裁判:“用户”,//引用自用户模型 要求:真//非空 }, subComment:[这]//自评论的类型为评论类型,也就是本身类型 });
最关键就是最后一句,实质上就是递归地引用了自身。查找的时候,也确实是需要根据上一层的subComment找到自己。套了深层的时候,查找的时候会容易绕晕,而且查找速度也会降低。建议做层级限制。
<强>二,实际开发场景中的层级关系数据强>
设想一下,假如顾客每切换一个规格,我们就根据第几个商品,切换的规格,没有被切换的规格去查找。那么每次都是一个三重循环…
这种情况下,比较好的做法就是,初始化获得数据的时候,建立三维数据,即数组(商品指数][颜色][规格]。这样每次切换,只要读取相应的项就可以找到sku了。
构造数据的方法,就显得不大明智了,一是组合数过多,并不是每种组合商品都存在,而是循环太多重。
这个时候,又要利用对象去构造数据了。
第一步,根据展示需要构造。展示的时候,只需要知道,某个商品的某个维度是某个值即可。即:
var obj={( {“商品”:“1”,sku:“,”维度1”:“…”,“维度2》:“……’,…} ]}
当点击切换维度的时候,首先根据原来的维度信息,更新用户新选的维度。遍历该新的维度对象,与维度信息数据比较,如果一一相符则找到新的sku。然后再更新即可。
在这里就要明确自己的“筹码”与“目标”,根据哪些东西,通过哪些途径可以到达目标。将每一步拆分成一个小方法去做…
首先想到的可能是用承诺处理,待两个接口都请求完毕后再进行处理。但是假,如第一个接口获得的是大部分主要的数据,第二个是小部分的数据。这个时候,等待第二个接口似乎就有点“不划算”了,特别是在用户体验上,当一个用户打开某个页面的时候,白屏就不好啦。
这个时候,我们就要善于利用对象去构造符合我们的数据对象了。
我们可以这样初始化一个对象:
var obj={ “唯一的参数1”+“_”+“唯一的参数1的id ': { 第一次请求的数据:[], 第二次请求的数据:[], }, “唯一的参数2”+“_”+“唯一的参数2的id: { 第一次请求的数据:[], 第二次请求的数据:[], }, … }
总之,就是要找到唯一的东西,来构造对象,然后再根据这个唯一的值把相应的数据填上。好吧,我都说晕了。看个例子:
我(var=0; & lt;data.length;我+ +){ (var j=0; j & lt;数据[我].params.length;j + +) { obj[[我]的数据。groupId +“_”+数据[我].params [j]。pcId]={}; } }//请求数据回来后 我(var=0; & lt;data.length;我+ +){ (var j=0; j & lt;数据[我].params.length;j + +) { obj[[我]的数据。groupId +“_”+数据[我].params [j]。pcId] [firstItem]=[我]数据.params [j] .list; } }//第二次数据回来后 我(var=0; & lt;data.length;我+ +){ (var j=0; j & lt;数据[我].params.length;j + +) { obj[[我]的数据。groupId +“_”+数据[我].params [j]。pcId] [moreItem]=[我]数据.params [j] .list; } }js处理层级数据结构的方法小结