国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JavaScript中對大量數(shù)據(jù)的多重過濾

開發(fā) 前端
數(shù)據(jù)過濾其實并不是多復雜的事情,只要把思路理清楚,搞明白什么數(shù)據(jù)是需要保留的,什么數(shù)據(jù)是臨時(中間過程)的,什么數(shù)據(jù)是最終結(jié)果……利用 Array.prototype 中的相關(guān)方法,或者諸如 lodash 之類的工具,很容易就處理出來了。

所有代碼使用 ES2015 語法,需要 ES5 語法的可以用 Babel - Try it out 或者 TypeScript Playground 翻譯。

問題提出

今天有朋友問我一個問題,前端通過 Ajax 從后端取得了大量的數(shù)據(jù),需要根據(jù)一些條件過濾,過濾的方法是這樣的:

  1. class Filter { 
  2.     filterA(s) { 
  3.         let data = this.filterData || this.data; 
  4.         this.filterData = data.filter(m => m.a === s); 
  5.     } 
  6.      
  7.     filterB(s) { 
  8.         let data = this.filterData || this.data; 
  9.         this.filterData = data.filter(m => m.b === s); 
  10.     } 
  11.  

現(xiàn)在迷糊了,覺得這樣處理數(shù)據(jù)不對,但是又不知道該怎么處理。

發(fā)現(xiàn)問題

問題就在過濾上,這樣固然可以實現(xiàn)多重過濾(先調(diào)用 filterA() 再調(diào)用 filterB() 就可以實現(xiàn)),但是這個過濾是不可逆的。假如過濾過程是這樣:

  1. f.filterA("a1"); 
  2. f.filterB("b1"); 
  3. f.filterA("a2");  

本來是希望按 "a1" 和 "b1" 過濾了數(shù)據(jù)之后,再修改***個條件為 "a2",但結(jié)果卻成了空集。

解決問題

發(fā)現(xiàn)了問題,就針對性的解決。這個問題既然是因為過濾過程不可逆造成的,那每次都直接從 this.data 開始過濾,而不是從this.filterData 開始過濾,就能解決問題。如果要這樣做,就需要將選擇的過濾條件先記錄下來。

記錄過濾條件

用一個列表記錄過濾條件當然是可行的,但是注意對同一個條件的兩次過濾是互斥的,只能保留***一個,所以應該用 HashMap 更為合適。 

  1. class Filter { 
  2.     constructor() { 
  3.         this.filters = {}; 
  4.     } 
  5.  
  6.     set(key, filter) { 
  7.         this.filters[key] = filter; 
  8.     } 
  9.  
  10.     getFilters() { 
  11.         return Object.keys(this.filters).map(key => this.filters[key]); 
  12.     } 
  13.  

這種情況下,像上面的過程表示為

  1. f.set("A", m => m.a === "a1"); 
  2. f.set("B", m => m.b === "b1"); 
  3. f.set("A", m => m.a === "a1"); 
  4. let filters = f.getFilters(); // length === 2;  

上面第 3 句設置的 filter 覆蓋了第 1 句設置的那個。現(xiàn)在再用***取得的 filters 依次來過濾原數(shù)據(jù) this.data,就能得到正確的結(jié)果。

有人會覺得 getFilters() 返回的列表不是按 set 的順序的——的確,這是 HashMap 的特點,無序。不過對于簡單條件的判斷,不管誰先誰后,結(jié)果是一樣的。但是對于一些復合條件判斷,就可能會有影響。

確實需要的話,可以通過 array 代替 map 來解決一下順序的問題,但這樣查找效率會降低(線性查找)。如果還想解決查找效率的問題,可以用 array + map 來處理。這里就不多說了。

過濾

實際上在使用的時候,每次都 getFilter() 再用一個循環(huán)來處理確實比較慢。既然 data 都封裝成 Filter 中,可以考慮直接給一個filter() 方法來送貨過濾接口。

  1. class Filter { 
  2.     filter() { 
  3.         let data = this.data; 
  4.         for (let f of this.getFilters()) { 
  5.             data = data.filter(f); 
  6.         } 
  7.         return data; 
  8.     } 
  9.  

不過這樣我覺得效率不太好,尤其是對大量數(shù)據(jù)的時候。不妨利用一下 lodash 的延遲處理過程。

利用 lodash 的延遲處理

  1. filter() { 
  2.     let chain = _(this.data); 
  3.     for (let f of this.getFilters()) { 
  4.         chain = chain.filter(f); 
  5.     } 
  6.     return chain.value(); 
  7.  

lodash 在數(shù)據(jù)大于 200 的時候會啟用延遲處理過程,也就是說,它會處理成一個循環(huán)中依次調(diào)用每一個 filter,而不是對每一個 filter 進行一次循環(huán)。

延遲處理和非延遲處理通過下圖可以看出來區(qū)別。非延遲處理總共會進行 n(這里 n = 3) 次大循環(huán),產(chǎn)生 n - 1 個中間結(jié)果。而延遲處理只會進行一次大循環(huán),沒有中間結(jié)果產(chǎn)生。

 

 

 

不過說實在的,我不太喜歡為了一點小事多加載一個庫,所以干脆自己做個簡單的實現(xiàn)

自己實現(xiàn)延遲處理

  1. filter() { 
  2.     const filters = this.getFilters(); 
  3.     return data.filter(m => { 
  4.         for (let f of filters) { 
  5.             // 如果某個 filter 已經(jīng)把它過濾掉了,也不用再用后面的 filter 來判斷了 
  6.             if (!f(m)) { 
  7.                 return false
  8.             } 
  9.         } 
  10.         return true
  11.     }); 
  12.  

里面的 for 循環(huán)還可以用 Array.prototype.every 來簡化:

  1. filter() { 
  2.     const filters = this.getFilters(); 
  3.     return data.filter(m => { 
  4.         return filters.every(f => f(m)); 
  5.     }); 
  6.  

數(shù)據(jù)過濾其實并不是多復雜的事情,只要把思路理清楚,搞明白什么數(shù)據(jù)是需要保留的,什么數(shù)據(jù)是臨時(中間過程)的,什么數(shù)據(jù)是最終結(jié)果……利用 Array.prototype 中的相關(guān)方法,或者諸如 lodash 之類的工具,很容易就處理出來了。

責任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2011-03-21 12:41:41

JavaScript

2015-09-14 15:23:44

JavaScriptfunction

2011-03-22 09:49:15

JavaScript

2024-01-22 09:41:05

MongoDB索引

2025-01-21 15:20:14

2021-03-09 09:06:41

漏洞數(shù)據(jù)安全數(shù)據(jù)

2016-04-11 09:36:45

軟件定義網(wǎng)絡SDN

2017-08-22 11:30:15

LinuxWireshark過濾數(shù)據(jù)包

2009-09-10 15:56:12

多重數(shù)據(jù)模型集合

2010-10-09 15:31:51

JavaScriptCookie

2022-11-17 08:00:18

JavaScript錯誤性能

2019-08-06 07:17:37

2022-12-15 08:00:38

JavaScript錯誤性能

2025-02-17 11:24:26

2014-05-29 17:11:59

優(yōu)化鏈接

2021-01-06 08:03:00

JavaScript數(shù)據(jù)結(jié)構(gòu)

2016-09-18 20:53:16

JavaScript閉包前端

2024-12-06 14:34:00

Spring過濾器

2010-09-09 14:25:32

2019-05-29 07:31:15

物聯(lián)網(wǎng)數(shù)據(jù)IOT
點贊
收藏

51CTO技術(shù)棧公眾號

久久久久久久| 国产成人一区在线| 一区二区福利视频| 天堂资源中文在线| 国产精品无遮挡| 超碰10000| 奇米在线7777在线精品| 91视频最新| 日韩电影免费网站| 欧美寡妇偷汉性猛交| 高清不卡av| 亚洲精品mp4| 99久久精品免费看国产小宝寻花| 在线看不卡av| 日本私人网站在线观看| 中文日产幕无线码一区二区| 日韩欧美中文在线| 黄色一级视频网站| 女人香蕉久久**毛片精品| 久久久午夜视频| 日韩电影中文字幕| 亚洲自拍偷拍二区| 蜜臀av国产精品久久久久| 精品午夜一区二区三区| 亚洲经典视频在线观看| 91精品国产一区二区三区| 免费在线稳定资源站| 久久夜色精品国产亚洲aⅴ| 日韩手机在线| 国产精品va在线播放| 欧美色网址大全| 亚洲精美色品网站| 国产精品18hdxxxⅹ在线| 国产欧美日韩中文字幕| 国产精品18久久久久久久网站| 日本电影一区二区在线观看| 欧美精品免费在线观看| 不卡一本毛片| 麻豆精品蜜桃视频网站| 国产妇女馒头高清泬20p多| 国产精品无码永久免费888| 欧美男女交配视频| 午夜视频一区在线观看| 成人直播在线观看| a在线视频观看| 欧美色爱综合网| 精品国模一区二区三区| 亚洲精品国产综合久久| 欧美女激情福利| 婷婷无套内射影院| 日韩中文字幕在线看| 久久精品99久久久| 激情内射人妻1区2区3区| 99精品在线免费| 黄网站色视频免费观看| 97成人超碰视| 黄动漫在线免费观看| 亚洲精品一区久久久久久| 国产色99精品9i| 免费在线超碰| 成人亚洲激情网| 亚洲毛片网站| av在线播放av| 都市激情在线视频| 欧美高清视频一区| 狠狠久久亚洲欧美| 日本女优北野望在线电影| 久久成人在线视频| 日韩欧美网站| 国产精品国产三级欧美二区| 秋霞电影一区二区| 久久久久久久久久久视频| 奇米一区二区三区| 欧亚一区二区三区| 岛国av在线网站| 欧美精品video| 欧美精品aa| av免费观看大全| 欧美精品久久久久久久| 亚洲精品在线播放| 91最新国产视频| 精品一区二区三区香蕉蜜桃| 91日韩视频在线观看| 欧美日韩在线播| 国产精品久久久久77777丨| 国产精品一区二区久久精品| 日本不卡一区二区三区高清视频| 久久综合久久色| 6080午夜不卡| 欧美理伦片在线播放| 日本亚洲欧洲精品| 亚洲天天做日日做天天谢日日欢| 日本aa在线| 91成品人片a无限观看| 日日夜夜精品免费视频| 国产福利电影| 亚洲人成网站在线播| 青青草原综合久久大伊人精品| 一本久道久久综合| 午夜av一区二区| 久久精品黄色| 精品亚洲欧美日韩| 一区二区欧美国产| 亚洲资源在线| 视频一区视频二区视频三区视频四区国产| 国产精品久久久久久久久晋中 | 三区四区在线视频| 久久全球大尺度高清视频| 日本v片在线高清不卡在线观看| 免费h片在线观看| 在线播放日韩av| 久久久精品日韩| 欧美成人片在线| 清纯唯美亚洲综合| 26uuu色噜噜精品一区| 免费成人在线电影| 欧美综合77777色婷婷| 欧美在线播放高清精品| 国产欧美日韩| 午夜宅男在线视频| 日韩在线免费视频| 国产高清不卡一区| 成人bbav| 亚洲国产精品久久久久婷婷老年 | 欧美亚洲色图视频| 亚洲国产精品人人爽夜夜爽| 亚洲激情不卡| 久久久久国产精品嫩草影院| 国产精品女人久久久久久| 欧美国产欧美亚州国产日韩mv天天看完整 | 日韩区国产区| 欧美日韩日本视频| 精品9999| h视频在线观看免费| 91手机在线观看| 91国偷自产一区二区开放时间 | 欧美96一区二区免费视频| porn视频在线观看| 91传媒免费看| 欧美午夜激情小视频| 欧美日韩老妇| 最新地址在线观看| 91亚洲精品视频| 91福利精品视频| 亚洲日本欧美| 亚洲综合影视| 欧美aaa在线观看| 亚洲老司机av| 粉嫩av一区二区三区| 亚洲综合av一区二区三区| 美女黄色免费看| 美日韩在线视频| 国产精品久久久久久久浪潮网站| 国产精品对白久久久久粗| 尤物国产在线观看| 国产免费一区二区三区香蕉精| 精品福利免费观看| 国产亚洲毛片| 怡红院成人在线| 国产精品久久a| 成人美女免费网站视频| 欧美色图在线观看| 精一区二区三区| 成人在线精品| 桥本有菜亚洲精品av在线| 高清av免费一区中文字幕| 日韩一区二区三区在线观看| 久久狠狠亚洲综合| 精品入口麻豆88视频| 欧美r片在线| 免费观看成人在线| 国产一区二区美女视频| 久久精品一区二区三区四区| 国产探花在线精品| 免费a级在线播放| 浮妇高潮喷白浆视频| 国产成人精品av| 91麻豆精品国产无毒不卡在线观看| 国产综合色精品一区二区三区| 一本色道69色精品综合久久| 日韩精品福利| 99久久久无码国产精品性色戒| 欧美精品激情在线| 欧美亚洲免费在线一区| 国产一区二区调教| 国产99精品一区| 欧美性受ⅹ╳╳╳黑人a性爽| 国内自拍在线观看| 成人免费视频网站入口| 最近中文字幕日韩精品 | 在线免费观看日本欧美爱情大片| 日韩专区av| 色总=综合色| 日本中文不卡| 91爱视频在线| 精品一区二区三区四区在线| 亚洲一区在线观看视频| 国产主播一区二区三区| 人人狠狠综合久久亚洲婷| 天堂√中文最新版在线|