2015-10-17 5 views
2

Это мой первый поворот с ramda. Я пытаюсь создать функцию карты, которая автоматически добавляет ключ к каждому объекту в массиве. Было бы полезно для реакции лиц без функции, например, где мы могли бы иметь функцию с подписьюСправка Рамды: реализация Pointfree с добавочными аргументами

({ prop1, prop2, key }) => ... 

и массив

[{ prop1: 'prop one', prop2: 'prop two' }, {...etc}] 

Вот рабочий пример:

const mapI = R.addIndex(R.map); 
const mapAddIndexedProp = R.curry((key, fn) => mapI(R.pipe(R.flip(R.assoc(key)), fn))); 
const mapAddKeyProp = mapAddIndexedProp('key'); 

Но, видя, что я действительно хочу - это функция, которая принимает строку и функцию, кажется, что должен быть способ сделать что-то вроде:

const mapAddIndexedProp = mapI(R.pipe(R.flip(R.assoc(<arg1>)), <arg2>)); 

но я не могу понять, как это сработает. Любые мысли были бы весьма признательны.

Или, скорее всего, есть более чистый способ сделать это с чем-то вроде «over» или transduce. Благодаря!

+0

Вы хотите преобразовать список, например '[{first: 'Alice', last: 'Jones'}, {first: 'Bob', last: 'Smith'}]' во что-то вроде '[{first : «Алиса», последнее: «Джонс», полное имя: «Алиса Джонс»}, {первая: «Боб», последняя: «Смит», полное имя: «Боб Смит»}] '? – davidchambers

+0

, который может быть конечной целью конечной функции, поскольку @Scott Sauyet имеет ниже в addFullNames, но идея состоит в том, чтобы абстрагировать добавление ключа к объекту как часть преобразования карты и предшествующую функции, которая будет вызвана эта новая функция отображения. Все еще не так ясно, но по существу это позволит вызывать newMapWithKey (someFn, [{...}, {...}]). В примере, который я дал, вызов mapAddKeyProp (someFn, [{...}, {...}]) добавит [{key: 0 ...}, {key: 1 ...}] к каждому объекту до переходя к someFn, которому может понадобиться использовать этот ключ. –

ответ

2

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

const addKey = R.curry((key, fn, vals) => 
    R.map(obj => 
     R.assoc(key, fn(obj), obj), vals)); 

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

const addKey2 = R.curry((key, fn, vals) => 
    R.addIndex(R.map)((obj, idx) => 
     R.assoc(key, fn(obj, idx), obj), vals)); 

Вы могли бы использовать, как это:

const addFullNames = addKey('fullName', person => 
    `${person.first} ${person.last}` 
); 

const initials = person => R.head(person.first) + R.head(person.last); 
const addIds = addKey2('id', (person, idx) => `${initials(person)}_${idx}`) 

var people = [ 
    {first: 'Wilma', last: 'Flintstone'}, 
    {first: 'Betty', last: 'Rubble'} 
]; 

addFullNames(people); //=> 
// [ 
//  {first: 'Wilma', last: 'Flintstone', fullName: 'Wilma Flintstone'}, 
//  {first: 'Betty', last: 'Rubble', fullName: 'Betty Rubble'} 
// ]; 

addIds(people); //=> 
// [ 
//  {first: 'Wilma', last: 'Flintstone', id: 'WF_0'}, 
//  {first: 'Betty', last: 'Rubble', id: 'BR_1'} 
// ]; 

Я уверен, что есть способ сделать это пои NTS-бесплатно. Но я также уверен, что это будет значительно менее элегантно.

+0

yep, это делает трюк и уборщик без трубы и флип, которые помогают ему быть ближе к тому, чтобы быть свободным от очков, при этом, безусловно, жертвуя удобочитаемостью. Это слово, о котором я думал. Спасибо, это на самом деле первый раз, когда я это слышал и что я пытался использовать с этой функцией. Я надеялся, что у Рамды есть способ диктовать, как применяются аргументы (некоторая комбинация R .__ и R.nthArg или что-то еще ...), чтобы достичь этого беспутного идеала здесь, но, вероятно, это не стоит Это дело. Благодаря! –

+0

Если у вас все еще есть момент, я думаю, что создание этой точки имеет некоторое сходство с ответом, который вы дали здесь: http://stackoverflow.com/questions/29617142/how-to-rewrite-this-in-terms-of-r -compose. Теперь код там выполняется с ошибкой «первый аргумент __arity должен быть неотрицательным целым числом не более 10». Любой шанс, что вы могли бы помочь мне понять, что код/​​ошибка и, возможно, дальнейший мой глупый квест здесь для pointfree реализации? –

+0

вот код, который я имею в виду: // take :: Number -> Object -> Object var take = R.converge ( R.pick, R.useWith (R.take, R.identity, R.keys), R.nthArg (1) ); –

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

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