ramda进化函数的例子

时间:2017-02-09 11:40:21

标签: javascript functional-programming ramda.js

来自Ramda Repl:

var tomato  = {firstName: '  Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};

为什么这样做:

var transformations = {
  firstName: ()=>'Potato'
};
// => {"data": {"elapsed": 100, "remaining": 1400}, "firstName": "Potato", "id": 123}

但这并不是:

var transformations = {
  firstName:'Potato'
};
//=>{"data": {"elapsed": 100, "remaining": 1400}, "firstName": "  Tomato ", "id": 123}

R.evolve(转化,番茄);

2 个答案:

答案 0 :(得分:5)

  

R.evolve

     

根据object 函数,通过递归演变transformation的浅表副本来创建新对象。所有非基本属性都通过引用复制。

     

如果演进对象中不存在相应的密钥,则不会调用transformation 函数

简而言之,转型必须是功能

  

为什么这样做:

var transformations = {
  firstName: ()=>'Potato'
};

因为()=>'Potato'功能

  

但这并不是:

var transformations = {
  firstName:'Potato'
};

由于'Potato'字符串不是函数

在提供的转换不是函数的情况下,原始值。

以下是evolve的源代码。我加粗您的示例到达输出所需的代码路径

module.exports = _curry2(function evolve(transformations, object) {
  var result = {};
  var transformation, key, type;
  for (key in object) {
    transformation = transformations[key];
    type = typeof transformation;
    result[key] = type === 'function'                 ? transformation(object[key])
                : transformation && type === 'object' ? evolve(transformation, object[key])
                                                      : object[key];
  }
  return result;
});

答案 1 :(得分:0)

@ naomik解释了原因 - 但如果由于某种原因你需要来使用evolve,你可以这样做:

{
    firstName: R.always('Potato')
}

值得记住的是,赋予变换的参数是当前值,如果密钥不存在,则不会添加任何内容。