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

时间:2017-05-12 02:12:53

标签: functional-programming ramda.js

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

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>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

问题是R.set为其第二个参数获取值而不是函数。并且你不能切换到R.over,它确实需要函数但是用该镜头的当前值调用它,而不是提供给外部函数的完整数据对象。

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

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

但是如果你打算让这一点免费,lift就是你的朋友:

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

虽然您也可以使用R.ap,但这会非常好,除非R.set以错误的顺序获取参数,因此您必须使用R.flip

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

您可以在 Ramda REPL 中看到所有这些内容。