2016-01-07 89 views
1

使用Ramda Js,我需要創建一個函數,該函數可以使用同一對象上不同屬性的值設置一個對象屬性。我嘗試到目前爲止如下:Ramda Js:使用同一對象的值設置對象的屬性

var foo = R.set(R.lensProp('bar'), 'foo' + R.prop('foo')); 
var result = foo({foo:"bar"}); 

期望的結果:

{foo:"bar", bar:"foobar"} 

實際結果:

{foo:"bar", bar: "foofunction f1(a) {... etc"} 

顯然,我在這裏誤解的東西,任何見解如何處理這將不勝感激。

回答

7

當一個屬性的值取決於另一個屬性的值時,鏡頭並不適合。一個lambda可能是最好的位置:

const foo = o => R.assoc('bar', 'foo' + o.foo, o); 

foo({foo: 'bar'}); 
// => {foo: 'bar', bar: 'foobar'} 
+0

同意。沒有好的理由去免費點。 –

+0

啊,工作就像一個魅力。謝謝! –

5

我剛剛編碼像從@davidchambers答案,然後做了一個免費的分版,只顯示拉姆達實際上是如何更簡單的。而不是把它扔出去,這裏是多麼糟糕看起來比較:

var foo = (obj) => R.assoc('bar', 'foo' + obj.foo, obj); 
var foo = R.converge(R.assoc('bar'), [R.pipe(R.prop('foo'), R.concat('foo')), R.identity]); 

這兩個,有一箇中間版本都可以在Ramda REPL

+0

乾杯斯科特!有趣的是,無縫版本需要多長時間。 –

+0

我不保證沒有更簡潔的免提版本。但是lambda表達式已經相當乾淨了。 –

相關問題