簡體   English   中英

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'})

我知道,這並不是全部都是免費的,但是通過這種方式,有問題的部分被隔離到一個點,在這一點上它不能再被分解成更小的部分,我們總是可以回到那些找到更好的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM