Ramda Js:使用同一对象中的值设置对象的属性

Jam*_*ght 4 javascript ramda.js

使用Ramda Js,我需要创建一个函数,该函数可以使用同一对象上不同属性的值设置一个对象属性.我到目前为止的尝试如下:

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

期望的结果:

{foo:"bar", bar:"foobar"}
Run Code Online (Sandbox Code Playgroud)

实际结果:

{foo:"bar", bar: "foofunction f1(a) {... etc"}
Run Code Online (Sandbox Code Playgroud)

很明显,我在这里误解了一些东西,任何有关如何处理这个问题的见解都会受到赞赏.

dav*_*ers 10

当一个属性的值取决于另一个属性的值时,镜头不适合.一个lambda可能是最好的:

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

foo({foo: 'bar'});
// => {foo: 'bar', bar: 'foobar'}
Run Code Online (Sandbox Code Playgroud)


Sco*_*yet 8

我刚刚编写了类似@davidchambers的答案,然后制作了一个无点版本,只是为了表明lambda实际上有多简单.而不是抛弃它,这是相比它看起来有多糟糕:

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]);
Run Code Online (Sandbox Code Playgroud)

Ramda REPL提供这两个中间版本