如何将值动态设置为 属性?

How can I dynamic set a value into a property?

如何将 属性 设置为应该解析的值..就像这个..

const getDataFromServer = (id) => ({id: * 2})
R.set(payloadProp, getDataFromServer)({id: 4}); // WRONG, is setting to a function instend to resolve a function with `{id: 4}`

const fetch = (id) => {
  return { num: id * 2 }
};

const idProp = R.lensProp('id');
const getDataFromServer = R.pipe(R.view(idProp), fetch);

const payloadProp = R.lensProp('payload');
const setPayloadFromFetch = R.set(payloadProp, getDataFromServer); // NOT WORK, return payload as function

const obj = { id: 1, payload: { message: 'request' } }
const ret = setPayloadFromFetch(obj);
console.log(ret);
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.23.0/ramda.min.js"></script>

问题在于 R.set takes a value, not a function, for its second parameter. And you can't switch to R.over,它确实接受函数,但使用该镜头的当前值调用它,而不是提供给外部函数的完整数据对象。

解决这个问题的最简单方法就是在两个地方传递对象:

const setPayloadFromFetch = obj => R.set(payloadProp, getDataFromServer(obj), obj);

但是,如果您打算免除这一点,lift 是您的朋友:

const setPayloadFromFetch = R.lift(R.set(payloadProp))(getDataFromServer, identity);

尽管您也可以使用 R.ap, which would be very nice except that R.set takes its parameters in the wrong order for it, and so you have to use R.flip

const setPayloadFromFetch = R.ap(R.flip(R.set(payloadProp)), getDataFromServer);

你可以在 Ramda REPL.

中看到所有这些