2016-12-16 7 views
0

У меня есть метод, который требует нескольких аргументов, и я пытаюсь настроить трубу ramda для ее обработки.Труба Рамды с несколькими аргументами

Вот пример:

const R = require('ramda'); 
const input = [ 
    { data: { number: 'v01', attached: [ 't01' ] } }, 
    { data: { number: 'v02', attached: [ 't02' ] } }, 
    { data: { number: 'v03', attached: [ 't03' ] } }, 
] 

const method = R.curry((number, array) => { 
    return R.pipe(
    R.pluck('data'), 
    R.find(x => x.number === number), 
    R.prop('attached'), 
    R.head 
)(array) 
}) 

method('v02', input) 

Есть уборщик способ сделать это, особенно x => x.number === number часть filter и того, чтобы позвонить (array) в конце трубы?

Here's ссылка на приведенный выше код, загруженный в ремень ramda.

ответ

2

Один из способов это могло бы быть переписано:

const method = R.curry((number, array) => R.pipe(
    R.find(R.pathEq(['data', 'number'], number)), 
    R.path(['data', 'attached', 0]) 
)(array)) 

Здесь мы заменили использование R.pluck и анонимные функции, данное R.find с R.pathEq заданного в качестве предиката R.find вместо. После обнаружения значение можно получить, пройдя по свойствам объекта с помощью R.path.

Это можно переписать без ограничения, используя R.useWith, хотя я чувствую, что читаемость теряется в процессе.

const method = R.useWith(
    R.pipe(R.find, R.path(['data', 'attached', 0])), 
    [R.pathEq(['data', 'number']), R.identity] 
) 
1

Я думаю, что читаемость может быть улучшена с помощью pluck и prop вместо path. Например:

const method = R.useWith(
    R.pipe(R.find, R.prop('attached')), 
    [R.propEq('number'), R.pluck('data')] 
); 

И, конечно, лучше использовать хорошее имя для функции. Мне нравится getAttachedValueByNumber.

Смежные вопросы