繁体   English   中英

Ramdajs - 如何结合管道和函数来更新对象

[英]Ramdajs - how to combine pipe and function to update an object

我有一个接受两个参数的函数。

const myfunction = (xyz) => async(param) => {
   return "some value " + xyz + param.a;
}

和一个以对象为参数的管道,

R.pipe(

)({"a":"a value"});

如何使用函数返回值向对象添加新属性?

预期输出:

{
  "a": "a value",
  "b": "some value xyz a value"
}

尝试了以下,但参数错误

R.pipe(
  R.assoc("b", myfunction("xyz")),
)({ "a" :"a value"});



R.pipe(
      R.assoc("b", myfunction("xyz")(R.identity)),
    )({ "a" :"a value"});

我认为 Ramda 并没有为此内置任何东西。 我们可以将它写在几个 Ramda 函数之上,如下所示:

 const myfunction = (xyz) => async (param) => { return "some value " + xyz + param .a } const foo = (param) => myfunction ('xyz') (param) .then (flip (assoc ('b')) (param)) foo ({a: 'a value'}) .then (console .log)
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script> const {flip, assoc} = R </script>

但目前还不清楚这是否比普通 JS 版本更好,例如:

const foo = (param) => 
  myfunction ('xyz') (param) .then (v => ({...param, b: v}))

(我是 Ramda 的创始人和忠实粉丝;它根本不会试图解决所有问题。)

然而,其中任何一个都有一个有趣的抽象,创建我们自己的组合器来处理(f, g) => (x) => f (x) .then (g (x))的整体流程。 因为它感觉比较接近pipe ing,并且因为有以鸟类命名组合子的强大传统,所以我将其命名为piper ,是“sandpiper”的缩写。 抽象出来,我们可以将foo简化为如下所示:

 const piper = (f, g) => (p) => f (p) .then (g (p)) const myfunction = (xyz) => async (param) => { return "some value " + xyz + param .a } const foo = piper (myfunction ('xyz'), flip (assoc ('b'))) foo ({a: 'a value'}) .then (console .log)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script> const {flip, assoc} = R </script>

这是一种非常强大的技术,可以抽象出我们函数的逻辑框架,以便在多个地方使用。 当然,它不会对像这样的单个函数添加任何内容,但它可以让我们找到与未来代码的共同点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM