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

Javascript Ramda Js:使用同一对象的值设置对象的属性,javascript,ramda.js,Javascript,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"} 很明显,我在这里误解了一些东西,

使用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"}

很明显,我在这里误解了一些东西,如果能深入了解如何做到这一点,我们将不胜感激。

当一处房产的价值取决于另一处房产的价值时,镜片并不适合。在这里,lambda可能是最好的:

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

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

我刚刚编写了类似于@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]);

这两个中间版本在

上可用。我将问题分为两部分:首先,您需要将对象的
foo
属性复制到
bar
,然后更改
bar
的值。ramda中没有现成的第一个解决方案,但第二个解决方案可以使用
evolve

import { curry, assoc, compose, evolve } from 'ramda'

// String -> String -> {k: v}
const copyPropAs = curry((from, to, obj) => assoc(to, obj[from], obj))

// String -> String -> String
const prefix = curry((value, string) => value + string)

const fn = compose(
  evolve({
    foo: prefix('foo')
  }),
  copyPropAs('foo', 'bar')
)

fn({foo: 'bar'})

我知道,它并非都是无点的,但通过这种方式,有问题的部分被隔离到一个无法再分解为更小部分的点,我们总是可以回到这些点来找到更好的实现。

斯科特干杯!有趣的是,无点数版本需要多长时间。我不能保证没有更简洁的无点数版本。但是lambda表达式已经相当干净了。