2017-01-13 8 views
0

tl; dr: Я ищу Ramda's (http://ramdajs.com), эквивалентный функции Mori's knit.Применить различные функции к ключу и значению пары с помощью Ramda

Я хочу применить другую функцию к ключу и значению в паре ключ/значение. Это (надуманный) пример использует mori.knit(f0, f1, ...) применить toUpper функцию на ключ и toLower функцию на значение пары ключ/значение:

const pairs = [ [ "key1", "VAL1" ], [ "key2", "VAL2" ], ... ]); 
const result = mori.knit(toUpper, toLower, pairs); 
// => [ [ "KEY1", "val1" ], [ "KEY2", "val2" ], ... ] 

Я ищу эквивалент с помощью Ramda применить другую функцию к ключу и значению пары ключ/значение.

ответ

1

Ramda не имеет точно такой функции. Нет ничего сложного в построении. Вот версия, похоже, со слегка измененным API и более общо:

const knit = compose(map, zipWith(call)); 

const pairs = [["key1", "VAL1"], ["key2", "VAL2"], ["key3", "VAL3"]]; 
knit([toUpper, toLower])(pairs); 
//=> [["KEY1", "val1"], ["KEY2", "val2"], ["KEY3", "val3"]] 

const triples = [["key1", "VAL1", 1], ["key2", "VAL2", 2], ["key3", "VAL3", 3]]; 
const square = n => n * n; 
knit([toUpper, toLower, square])(triples); 
//=> [["KEY1", "val1", 1], ["KEY2", "val2", 4], ["KEY3", "val3", 9]] 

Если вы действительно хотите, чтобы передать список в первоначальный вызов, вы могли бы написать это следующим образом:

const knit = useWith(map, [zipWith(call), identity]); 

И если эта версия кажется излишне загадочной, вы всегда можете использовать версию, которая не являются точки свободной, таких как:

const knit = (fns, xs) => map(zipWith(call, fns), xs); 

Но ни один из них не имеет свободный список функций; они завернуты в список. Это норма для функций Рамды. Если вы действительно хотите больше один, как функции Мори, ваш может добавьте unapply:

const knit = compose(map, unapply(zipWith(call))); 
knit(toUpper, toLower)(pairs); 
knit(toUpper, toLower, square)(triples); 

Мое личное предпочтение было бы для самого простого:

const knit = compose(map, zipWith(call)); 
knit([toUpper, toLower])(pairs); 
knit([toUpper, toLower, square])(triples); 

Вы можете играть с некоторыми из эти варианты на Ramda REPL.

+0

Благодарим вас за подробный ответ, именно это я и искал! ура – mattijs

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

  • Нет связанных вопросов^_^