如何将值动态设置为 属性?
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.
中看到所有这些
如何将 属性 设置为应该解析的值..就像这个..
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.
中看到所有这些