亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過Map結構數據來處理業務邏輯中的response data?

通過Map結構數據來處理業務邏輯中的response data?

眼眸繁星 2019-05-09 22:28:01
在業務開發過程中,會有很大概率在與后臺對接數據的時候,遇到這種數據格式{...data:[{...id:10000,name:'中國電信',...},],...}假設我們已經將這個data渲染為一個列表,然后現在有一個需求:在一個Input組件中輸入id,之后對data中對應的id那一項進行某些業務處理。按之前的習慣,就直接這樣了//處理Input組件輸入事件handleInput(id){data.forEach(item=>{if(item.id===id){//拿到item,然后處理業務邏輯}})}但是這樣的話感覺每次都得將整個data遍歷一遍,感覺太浪費性能了。所以在想可不可以用Map來處理一下,比如//將data轉換成類似Map的數據結構,或者newMap()貌似也可以?toMap(data,mainKey='id'){constmap={};data.forEach(item=>{map[mainKey]=item;});returnmap;}constmap=toMap(data);這樣轉換之后,后續就可以在handleInput(id)方法中直接用map[id]或者如果使用Map的話map.get(id)來獲取到對應的item了。不知道這樣做在實際的業務開發中是否具有可行性。。。
查看完整描述

2 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

我并不清楚js,所以我從c/c++的角度回答下。
用map是個不錯的選擇,首先復雜度就已經從n降到logn了,如果你的數據量級在上千以上的話,可以作個測試,比對下n和logn的時間差距(量級越大,差距越大)。
再者,就是你用了map后的這句代碼,
data.forEach(item=>{
map[mainKey]=item;
});
其中的forEach,我不清楚js是怎么實現的,至少在map中如果你要根據key找一個數據,應該用這個map提供的類似find的接口,這個接口的實現復雜度是logn。
用forEach,它實現的機制,可能是中序遍歷(利用左右孩子指針,具體參考線索二叉樹),也就是說,它的查找復雜度是n,一般用這種方法的目的,就是按序輸出所有數據。
所以,js的map容器的接口,是用find這種的,還是forEach,得去看文檔說明,或者谷歌,看下它們具體的內部實現機制。
-----------------------------分割-----------------
看了下上面的回答,如果你的data可以O(1)索引取值的話,建一個哈希映射也可以,但內存的代價自己估量,我說的哈希不是用map,它是一個整型數組,把id作為數組下標,data索引作為數組的值。
                            
查看完整回答
反對 回復 2019-05-09
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

可以啊,但是你寫的都太麻煩了
過濾直接用`filter:
[{id:1,name:'1'},{id:2,name:'2'}].filter(({id})=>id===1)
轉化直接用map:
[{id:1,name:'1'},{id:2,name:'2'}].map(d=>({[d.id]:d}))
```
寫成公用的toMap:
functiontoMap(data,key){
returndata.map(d=>({[d[key]]:d}))
}
想要獲取原始列表:
Object.values(toMap(data))
                            
查看完整回答
反對 回復 2019-05-09
  • 2 回答
  • 0 關注
  • 1047 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號