ramda进化函数的例子

Kor*_*vis 1 javascript functional-programming ramda.js

来自Ramda Repl:

var tomato  = {firstName: '  Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};
Run Code Online (Sandbox Code Playgroud)

为什么这样做:

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

但这并不是:

var transformations = {
  firstName:'Potato'
};
//=>{"data": {"elapsed": 100, "remaining": 1400}, "firstName": "  Tomato ", "id": 123}
Run Code Online (Sandbox Code Playgroud)

R.evolve(转化,番茄);

Tha*_*you 5

R.evolve

object根据transformation 函数递归演化一个浅副本,创建一个新对象.所有非基本属性都通过引用复制.

transformation 函数如果其对应的键不存在于进化对象存在将不被调用.

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

为什么这样做:

var transformations = {
  firstName: ()=>'Potato'
};
Run Code Online (Sandbox Code Playgroud)

因为()=>'Potato'是一个功能

但这并不是:

var transformations = {
  firstName:'Potato'
};
Run Code Online (Sandbox Code Playgroud)

因为'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;
});
Run Code Online (Sandbox Code Playgroud)