2016-01-29 83 views
1

我想知道是否建議傳遞並重新使用我用lodash創建的鏈式懶惰對象。是否有可能/建議重新使用lodash惰性物體?

var filtered = _(nonFiltered).filter(...).map(...); 

filtered.each(doStuff).value(); 

var reMapped = filtered.map(...).object(...); 

//keep using reMapped and filtered, sometimes calling .value() 

它是安全的以這種方式使用lodash連鎖目標?

+0

以何種方式 「安全」 後,立即?並推薦用於什麼用例? – Bergi

回答

4

是的,你絕對可以做到!

Lodash(> = v3.2)爲您提供了所有您需要的工具。您決定何時執行鏈(通過調用.commit()(請參見下文)或通過顯式或隱式調用.value()),甚至可以通過注入不同的集合/數組/對象來重用以前創建的鏈/值(通過調用.plant()(見下文))。

你應該考慮什麼,但是,是這樣的:

  1. 性能 --- 全連鎖店將在每次執行鏈時執行。例如,在您的示例中,如果執行reMapped鏈,則會再次執行初始filter()map()部件。即使你之前執行了filtered鏈。因此,從性能角度來看,在代碼中的某個點執行鏈並用新的lodash包裝器打包結果可能會有意義。這就是commit()

    var filtered = _(nonFiltered).filter(...).map(...).commit(); 
    var reMapped = filtered.(...).commit(); 
    

    通過這樣做,您將執行鏈並將結果包裝在新的lodash包裝中。當然,這與plant()(見下文)不一致。

    Click here for reference on commit()

  2. 可變生命週期 ---另外,你需要執行你的鏈時要特別注意的是,你的初始變量nonFiltered仍然指向同一個對象。即您無法創建您的連鎖店,並希望nonFiltered的新任務能夠自動進入連鎖店。這是plant()是有:

    reMapped.plant(nonFiltered).value(); 
    

    技術上,調用plant的時候,包裝被克隆,這讓原包裝中的修改。在性能方面,克隆是微不足道的。

    Click here for reference on plant()

  3. 內存管理 ---如果你通過包裝周圍太隨意,你可能最終與情況下的nonFiltered變量(更確切的對象/數組它指向的)通常會一直垃圾收集。但是,只要包裝器存在,垃圾收集器就無法清理。這對你的內存佔用量只有很小的影響,但是根據你創建的包裝器的數量以及你存儲它們的位置,這也可能意味着你可能最終平均增加了內存佔用量,這取決於你最終是什麼時候釋放包裝。

    最壞的情況,例如將存儲包裝在某種長壽命的物體上(例如,存儲在一個Angular服務中),包裝一個重量級$ http響應的結果,也許有很多不相關的數據,在執行包裝時會減少到原始大小的一小部分。

    再次,commitplant來救援。您可以從兩種策略可供選擇:

    1. 要麼用空值(是這樣的:_().filter(...)...)創建鏈和執行鏈之前使用plant(見(2))。
    2. 或者只是commit你的鏈你定義它(見(1))
+0

是的,#1是我擔心的那個,我特別想避免重複運行第一個懶惰的步驟('filter'和'map')。這種行爲是否在任何地方記錄? – Madd0g

+0

不幸的不是。但是一個快速測試顯示它(只需在你的過濾器函數中添加一個console.log)......但是我發現了一個解決方法(將在一分鐘內更新我的帖子) – NicBright

+0

精彩的答案,超出了我的預期,commit '是一個很棒的提示。謝謝! – Madd0g

相關問題