Ramda Js:使用来自同一对象的值在对象上设置 属性
Ramda Js: Setting property on an object using a value from the same object
使用 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 的答案的代码,然后制作了一个 points-free 版本,只是为了展示 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]);
这两个,中间版本在Ramda REPL
上可用
我会将问题分为两部分:首先你需要将一个对象的 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'})
我知道,这并非全无问题,但通过这种方式,有问题的部分被隔离到无法再分解为更小部分的程度,我们总是可以回到那些部分以找到更好的实现.
使用 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 的答案的代码,然后制作了一个 points-free 版本,只是为了展示 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]);
这两个,中间版本在Ramda REPL
上可用我会将问题分为两部分:首先你需要将一个对象的 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'})
我知道,这并非全无问题,但通过这种方式,有问题的部分被隔离到无法再分解为更小部分的程度,我们总是可以回到那些部分以找到更好的实现.