2016-02-12 24 views
2

我希望能夠設置裏面像這樣的數組中的所有對象的屬性:應用_.set與_.each在lodash

var items = [{ a: 1 }, { a: 2 }, { a: 3 }]; 

_.each(items, set('a', 4)); 

// result should be [{ a: 4 }, { a: 4 }, { a: 4 }] 

我試圖通過_.set使用_.rearg來做到這一點更改拍攝對象的最後一個像這樣的參數:

var set = _.rearg(_.set, [2, 0, 1]); 

但是,我不能讓_.curry上調用_.rearg頂部工作。

var set = _.curry(_.rearg(_.set, [2, 0, 1])); 

set('a', 3, { a: 4 }) 
// returns Object {a: 3} correctly 

set('a', 3) 
//returns undefined, should be a function 

所以能夠這樣稱呼它set('a', 3)({ a: 2 })期望的結果拋出一個錯誤,因爲它不返回的功能。

我該如何使用lodash來完成此操作?我肯定錯過了什麼。

回答

1

_.curry函數接受一個參數arity,你或許應該設置爲3

_.curry(func, [arity=func.length]) 

創建一個接受的func參數的函數,要麼調用func返回它的結果,如果至少arity數參數已經被提供,或者返回一個接受剩餘func參數的函數,依此類推。如果func.length不足,則可以指定func的arity

_.rearg結果具有零長度值,但基本的功能需要三個參數,所以你需要手動指定:

var set = _.curry(_.rearg(_.set, [2, 0, 1]), 3); 

這裏有一個現場演示:http://codepen.io/anon/pen/qbgmPq

+0

這正是我一直在尋找!謝謝! – DerekMT12

0

遍歷項目列表並在每個項目上使用_.set工作。

_.map(items,function(item){_.set(item,'a',5)}); 

_.each(items,function(item){_.set(item,'a',5)}); 

Codepen

0

,如果你的項目是

var items = [{ a: 1 }, { a: 2 }, { a: 3 }]; 

然後lodash _.each和_.set,它會是這樣

_.each(items, function(item){ 
    _.set(item, 'a', 4); 
}); 

你試圖做的是,在物品a上查找物品4,在物品a不知道何時是或4時。希望能幫助到你。

0

rearg()的問題出現在六個月後你必須閱讀你的代碼 - 破譯參數位置很麻煩。結合unary()partialRight()給出了更清晰的意圖:

_.each(items, _.unary(_.partialRight(_.set, 'a', 4))); 
+0

我明白你的觀點,但是這種語法更難以看清。你只需要編寫'set'一次,但你必須重做'_.unary(_。partialRight(_。設置...))'所有的地方。這對我來說似乎不那麼清楚和難以維持。 – DerekMT12