2017-02-09 17 views
1

От Ramda Repl:ramda функция эволюционируют пример

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 (преобразования, помидоры);

ответ

5

R.evolve

Создает новый объект рекурсивно развивается неполную копию object, в соответствии с transformationфункций. Все не примитивные свойства копируются по ссылке.

A 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; 
});
+0

Был составлен тот же самый ответ, прежде чем я увидел ваше ... Единственное, что я хотел добавить, это ссылка на источник, который показывает, что происходит, когда вы передаете что-то, что не является «функцией» или «объектом»: it возвращает 'object [key]' (строка 39) https://github.com/ramda/ramda/blob/v0.23.0/src/evolve.js#L37 – user3297291

+0

Хорошее добавление; Я обновлю ответ. – naomik

0

@ naomik объяснил, почему - но если по какой-то причине вы необходимости использовать эволюционировать, вы могли бы сделать:

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

Следует помнить, что аргумент, передаваемый преобразованию, является текущим значением, и если ключ не существует, он ничего не добавит.