2016-02-23 44 views
19

我有一個對象,看起來像如何使用lodash鏈接函數?

var foundUser = { 
    charData: [] 
} 

然後我用mysql加載從數據庫中的對象,然後我叫

_.assignIn(foundUser, rows[0]); 

但我得到一些額外的屬性,我不需要(這是不可解的使用選擇)

所以我打電話

foundUser = _.omit(foundUser, ['blah']); 

但是這將是很好,如果我可以只是做

_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']); 

但是,這將引發一個錯誤,我是不是做錯了或有另一種方式可以做到這一點?

+1

https://lodash.com/docs#_ – zerkms

+2

https://lodash.com/docs#chain –

回答

26

要使用lodash鏈,首先必須以包裹對象:

_(foundUser).assignIn(rows[0]).omit(['blah']).value(); 

進一步澄清:

_創建lodash對象,其允許隱式方法鏈接。隱式方法鏈接意味着在某些情況下它可能會返回一個原始值,而在另一些情況下,它可能會通過調用.value()來返回一個需要解包的lodash對象。

如果您使用_.chain(...),您將創建一個lodash對象,並使用顯式方法鏈接。結果始終是一個包裝值,並且總是需要通過調用.value()對其進行解包。

對於這裏進一步的參考是鏈接到文件:

Explicit chaining in Lodash

Implicit chaining in Lodash

+2

不,我能想到的你需要它的理由,但如果你想更明確一些,也可以使用'_chain(foundUser)'。 – Harangue

+0

要發表評論相同,你不*包裹對象 –

+1

@RobM。如果你做'_.chain()'你仍然包裝對象,它只是更明確 – Kenneth

10

作爲替代包裹鏈展開模式(沒有內在的錯誤,但替代品總是有趣的)還有另一種方法可以檢查。

嘗試利用_.flow

這個想法是flow內部的每個函數都會接收到前一個函數的輸出,這正是您所需要的。 一個例子,給出這樣的數據:

var foundUser = { 
    charData: [] 
}; 

var rows = [{ok: 1, blah: 'nope'}]; 

使用Lodash FP我們可以通過數據作爲最後一個參數。這個特性以及Lodash/fp中每個方法的自動壓縮使得我們在編寫函數時更加輕鬆。這意味着我們可以有這樣的簡潔和表現代碼:

_.flow(
_.assign(rows[0]), 
_.omit('blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1} 

使用標準版Lodash我們要巴結自己使用_.partial這些功能,代碼一定會看起來不那麼簡潔,但它仍然是可能做到所以:

_.flow(
_.partialRight(_.assign, rows[0]), 
_.partialRight(_.omit, 'blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1} 

使用流而不是鏈接的一大好處是,你可以輕鬆地與自己的自定義功能混合Lodash方法,因爲 - 因爲說 - 他們需要的是菊ST的數據作爲輸入和作爲輸出數據,而不是其他:

const yourFunction = d => ({ ...d, yourProp: 4 }); 

_.flow(
_.assign(rows[0]), 
yourFunction, 
_.omit('blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1, yourProp: 4} 

這使得函數組合更容易,更靈活,可以說,自然會導致更富有表現力的代碼。

另一件要注意的事情。如果您僅安裝和導入您使用的Lodash方法,則只需添加flow包,而不是像鏈接那樣添加整個Lodash庫。

npm i --save lodash.flow 

Vs的

npm i --save lodash 

也許在許多實際應用中可以忽略不計的優勢在哪裏有Lodash的完整版本是沒有問題的,可以說是更容易維護最新的,但萬一很方便您正在編寫一個庫或腳本,將作爲第三方工具使用。在這種情況下,您將能夠在分佈式大小方面保持較低的佔用空間。

Lodash方法文檔:

值得一看

兩篇文章:

NB - 第二篇文章的標題是在我看來有點嚴厲,但不要跳過它,內容的確很翔實。

其他一些注意事項:

  • 在Lodash/FP流量的別名是_.pipe,所以你可以選擇你喜歡哪個。

  • 您還可以使用_.flowRight(或其fp別名_.compose)如果你喜歡從右到左的成分,如Ramda's compose看到。

例子:

_.flow(
_.assign(rows[0]), // #1st to execute 
yourFunction, // #2 
_.omit('blah'), // #3 
)(foundUser); 

// is the same as... 

_.flowRight(
_.omit('blah'), // #3rd to execute 
yourFunction, // #2 
_.assign(rows[0]), // #1 
)(foundUser); 
0

你有沒有試過lodash/fp?它具有所有相同的功能,但它們都是咖喱的,它們都沒有改變輸入。

因此,你可以用一種非常好的方式來組合它們。

例子:

import moment from 'moment' 
import { compose, filter, groupBy, size, sortBy } from 'lodash/fp' 

const fromAdmin = filter({ type: 'admin' }) 
const groupedByDate = groupBy(message => moment(message.createdAt).format('YYYYMMDD')) 
const sorted = sortBy('createdAt') 
const unreadByUser = filter({ isReadByUser: false }) 

const groupedMessages = compose(
    groupedByDate, 
    sorted, 
    unreadByUser, 
    fromAdmin, 
)(messages)