2016-02-12 27 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