最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js處理層級數(shù)據(jù)結(jié)構(gòu)的方法小結(jié)

 更新時間:2017年01月17日 10:27:16   作者:小蚊  
本文主要介紹了js處理層級數(shù)據(jù)結(jié)構(gòu)的方法。具有一定的參考價值,下面跟著小編一起來看下吧

開發(fā)者對復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的處理能力也是體現(xiàn)開發(fā)者水平的一個度量吧。。。最近發(fā)現(xiàn)自己對一些嵌套數(shù)據(jù)結(jié)構(gòu)、層級數(shù)據(jù)結(jié)構(gòu)的處理能力不大足。。。經(jīng)常被這些把自己繞暈。。。嚴重影響開發(fā)效率。。。就稍微低總結(jié)了一下下。。。

一、mongodb設(shè)計層級關(guān)系數(shù)據(jù)(這里主要說的是mongoose)

①假設(shè)有這樣的一個場景。某個文章下面有評論,每個評論可以被回復(fù),每個回復(fù)又可以被回復(fù)...

首先,我們知道,普通的一對多的關(guān)系,可以通過引用,populate操作找出相應(yīng)的引用對象,如:

var essaySchema = new mongoose.Schema({ //文章schema
 user:{
 type: mongoose.Schema.Types.ObjectId, //發(fā)布者的引用
 ref: 'user', //引用自User Model
 require: true //非空
 },
 ...
});

文章與評論的關(guān)系,就是一對多。自然也是按照這種處理方式即可。

但是,評論與回復(fù)的關(guān)系,就有點意思了。首先,評論和回復(fù),回復(fù)與該回復(fù)的回復(fù)雖然是不同的東西(看著就拗口),但是這些的shema的信息都是由相同的字段構(gòu)成。也就是說,可以說是自己嵌套了多個自己。

這個時候,就要這樣處理了:

//評論Schema定義
var commentSchema = new mongoose.Schema({
 content: {
 type: String,
 require: true
 },
 created: {
 type: Date,
 "default": Date.now
 },
 user: {
 type: mongoose.Schema.Types.ObjectId, //用戶的引用
 ref: 'user', //引用自User Model
 require: true //非空
 },
 subComment: [this], //自評論的類型為評論類型,也就是本身類型
});

最關(guān)鍵就是最后一句,實質(zhì)上就是遞歸地引用了自身。查找的時候,也確實是需要根據(jù)上一層的subComment找到自己。套了深層的時候,查找的時候會容易繞暈,而且查找速度也會降低。建議做層級限制。

實踐小項目:一個簡單版node+express+mongodb的圖片分享

二、實際開發(fā)場景中的層級關(guān)系數(shù)據(jù)

①假設(shè)有這樣的一個場景,有一個商品數(shù)組,每個商品有兩個維度,顏色和規(guī)格。顏色和規(guī)格的組合會產(chǎn)生的sku(可以理解為每種組合情況的一個標識)數(shù)量為顏色數(shù)量*規(guī)格數(shù)量。當我們渲染完畢之后,顧客每切換一個規(guī)格,都要找到相應(yīng)的sku。

設(shè)想一下,假如顧客每切換一個規(guī)格,我們就根據(jù)第幾個商品,切換的規(guī)格,沒有被切換的規(guī)格去查找。那么每次都是一個三重循環(huán)。。。

這種情況下,比較好的做法就是,初始化獲得數(shù)據(jù)的時候,建立三維數(shù)據(jù),即Array[商品index][顏色][規(guī)格]。這樣每次切換,只要讀取相應(yīng)的項就可以找到sku了。

但是,假若商品的維度不是二維,而是多維呢,而且不一定每種組合都存在這樣的商品的呢?

構(gòu)造數(shù)據(jù)的方法,就顯得不大明智了,一是組合數(shù)過多,并不是每種組合商品都存在,而是循環(huán)太多重。

這個時候,又要利用對象去構(gòu)造數(shù)據(jù)了。

第一步,根據(jù)展示需要構(gòu)造。展示的時候,只需要知道,某個商品的某個維度是某個值即可。即:

var obj = {[
{'商品':'1',sku:'','維度1':'...','維度2':'...',...}
]}

當點擊切換維度的時候,首先根據(jù)原來的維度信息,更新用戶新選的維度。遍歷該新的維度對象,與維度信息數(shù)據(jù)比較,如果一一相符則找到新的sku。然后再更新即可。  

在這里就要明確自己的"籌碼"與"目標",根據(jù)哪些東西,通過哪些途徑可以到達目標。將每一步拆分成一個小方法去做。。。

②假設(shè)有這樣的一個場景,首先要根據(jù)一些規(guī)則合并一些請求去請求不同的數(shù)據(jù)(即返回的數(shù)據(jù),是多個參數(shù)結(jié)合在一起的,必須還要解析出數(shù)據(jù)原先的對應(yīng)關(guān)系),然后獲得部分數(shù)據(jù)。再用獲得的部分數(shù)據(jù)中某條數(shù)據(jù)的參數(shù)去請求第二個接口。然后獲得不同的一些數(shù)據(jù)。

首先想到的可能是用promise處理,待兩個接口都請求完畢后再進行處理。但是假如,第一個接口獲得的是大部分主要的數(shù)據(jù),第二個是小部分的數(shù)據(jù)。這個時候,等待第二個接口似乎就有點"不劃算"了,特別是在用戶體驗上,當一個用戶打開某個頁面的時候,白屏就不好啦?! ?/p>

這個時候,我們就要善于利用對象去構(gòu)造符合我們的數(shù)據(jù)對象了。

我們可以這樣初始化一個對象:

var obj = {
 '唯一的參數(shù)1'+‘_'+'唯一的參數(shù)1的id' : {
 第一次請求的數(shù)據(jù) : [],
 第二次請求的數(shù)據(jù) : [], 
 },
 '唯一的參數(shù)2'+‘_'+'唯一的參數(shù)2的id' : {
 第一次請求的數(shù)據(jù) : [],
 第二次請求的數(shù)據(jù) : [], 
 },
 ...
}

總之,就是要找到唯一的東西,來構(gòu)造對象。然后再根據(jù)這個唯一的值把相應(yīng)的數(shù)據(jù)填上。好吧,我都說暈了??磦€例子:

for(var i = 0;i < data.length; i++){
 for(var j = 0;j < data[i].params.length; j++){
 obj[data[i].groupId + '_' + data[i].params[j].pcId] = {};
 }
}
//請求數(shù)據(jù)回來后
for(var i = 0;i < data.length; i++){
 for(var j = 0;j < data[i].params.length; j++){
 obj[data[i].groupId + '_' + data[i].params[j].pcId][firstItem] = data[i].params[j].list;
 }
}
//第二次數(shù)據(jù)回來后
for(var i = 0;i < data.length; i++){
 for(var j = 0;j < data[i].params.length; j++){
 obj[data[i].groupId + '_' + data[i].params[j].pcId][moreItem] = data[i].params[j].list;
 }
}

注意,如果是用vue,因為第二次請求的數(shù)據(jù)參數(shù)來自第一次,所以請二次數(shù)據(jù)回來之后,需要用全局api,set方法處理才會生效。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • js捕捉鍵盤事件和按鍵鍵值的方法

    js捕捉鍵盤事件和按鍵鍵值的方法

    下面小編就為大家?guī)硪黄猨s捕捉鍵盤事件和按鍵鍵值的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • ?typeScript入門基礎(chǔ)介紹

    ?typeScript入門基礎(chǔ)介紹

    這篇文章主要介紹了?typeScript入門基礎(chǔ),TypeScript?是由微軟開發(fā)的開源、跨平臺的編程語言,是?javaScript?的超集,最終被編譯為?javaScript代碼。常常被簡稱為TS支持JS、ES語法,下文將繼續(xù)其他基礎(chǔ)介紹,需要的朋友可以參考一下
    2022-02-02
  • JavaScript delete 屬性的使用

    JavaScript delete 屬性的使用

    JavaScript對象數(shù)據(jù)結(jié)構(gòu)基本形式:{ key : value},其中key:value就為對象的一個屬性,key作為屬性名稱,value為屬性值,這值可以是任何JavaScript數(shù)據(jù)類型。
    2009-10-10
  • DOM 事件的深入淺出(一)

    DOM 事件的深入淺出(一)

    本文主要介紹了不同DOM級別下的事件處理程序,同時介紹了事件冒泡和捕獲的觸發(fā)原理和方法。熟練地使用不同級別的DOM事件并且解決相應(yīng)的瀏覽器兼容性問題對我們的前端項目開發(fā)會很有幫助。
    2016-12-12
  • js綜合應(yīng)用實例簡單的表格統(tǒng)計

    js綜合應(yīng)用實例簡單的表格統(tǒng)計

    在做調(diào)查問卷的過程中,遇到一個表格的統(tǒng)計問題,一個需要用到j(luò)s方面的綜合知識,感覺還不錯所以記錄下來與大家分享,感興趣的朋友可以了解下
    2013-09-09
  • 關(guān)于include標簽導(dǎo)致js路徑找不到的問題分析及解決

    關(guān)于include標簽導(dǎo)致js路徑找不到的問題分析及解決

    本文為大家詳細介紹下關(guān)于使用jsp:include標簽及<%@ include標簽時要注意的事項以及實測發(fā)現(xiàn)問題并解決問題的全過程,感興趣的各位可以參考下哈,希望對大家有所幫助
    2013-07-07
  • js中function()使用方法

    js中function()使用方法

    通過函數(shù)對象的性質(zhì),可以很方便的將一個函數(shù)賦值給一個變量或者將函數(shù)作為參數(shù)傳遞,下面為大家介紹下函數(shù)的使用語法
    2013-12-12
  • JavaScript實現(xiàn)Iterator模式實例分析

    JavaScript實現(xiàn)Iterator模式實例分析

    這篇文章主要介紹了JavaScript實現(xiàn)Iterator模式,實例分析了Iterator模式的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • js實現(xiàn)統(tǒng)計字符串中特定字符出現(xiàn)個數(shù)的方法

    js實現(xiàn)統(tǒng)計字符串中特定字符出現(xiàn)個數(shù)的方法

    這篇文章主要介紹了js實現(xiàn)統(tǒng)計字符串中特定字符出現(xiàn)個數(shù)的方法,涉及javascript針對字符串中字符運算操作相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • JavaScript 代碼分割的實現(xiàn)步驟

    JavaScript 代碼分割的實現(xiàn)步驟

    JavaScript代碼分割是一種優(yōu)化策略,通過將代碼拆分成較小的塊,只在需要時加載,可以降低初始加載時間,減小頁面體積,本文主要介紹了JavaScript代碼分割的實現(xiàn)步驟,感興趣的可以了解一下
    2024-01-01

最新評論

林周县| 桐梓县| 确山县| 铅山县| 南和县| 大同县| 宁波市| 白山市| 汝城县| 若尔盖县| 长治县| 伊通| 和硕县| 江油市| 合阳县| 大宁县| 都匀市| 高青县| 岢岚县| 嘉鱼县| 钟祥市| 城市| 毕节市| 大宁县| 陇西县| 镇雄县| 广丰县| 伊宁市| 西乌珠穆沁旗| 遂昌县| 弥渡县| 南和县| 崇明县| 大足县| 中西区| 海南省| 繁昌县| 彩票| 东海县| 吉安县| 漳浦县|