来自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(转化,番茄);
答案 0 :(得分:5)
根据
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)
{
firstName: R.always('Potato')
}
值得记住的是,赋予变换的参数是当前值,如果密钥不存在,则不会添加任何内容。