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的答案进行了编码,然后制作了一个无积分版本,只是为了展示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'})
我知道,这并不全是无点的,但通过这种方式,有问题的部分被隔离到一个点,即它不能再分解成更小的部分,我们总是可以回到这些部分来找到更好的实现。
相关文章:
- 从每个父对象获取attr,并为每个子对象设置attr
- 用javascript为预定义对象设置原型
- Kendo UI数据源使用javascript对象设置
- 正在对通过object.create创建的对象设置原型
- 用对象设置函数变量's值
- 将对象设置为Backbone.js模型,而不必调用“;set()"在每一处房产上
- 将对象设置为Chrome存储
- 如何为不同的对象设置不同的灯箱
- 如何在基于json数据的Javascript中为网页上的多个对象设置动画
- 三.js - 如何为对象设置边框
- 将节点.js对象设置为从文件读取的数据
- Javascript:在为动态创建的对象设置 onClick 处理程序时避免 eval()
- 如何从另一个 json 对象为 json 对象设置值
- 为具有未定义值的嵌套对象设置默认值的最简单方法
- 如何为嵌套对象设置状态
- 将对象设置为jquery中attr()方法的值
- 如何为对象设置默认函数
- 通过全局对象设置骨干木偶模型
- 无法对未定义的对象设置属性
- 为我的对象设置空值