Necesito convertir esto:

let arr = [{ id: 1, name: 'rod'} , { id: 2, name: 'hey' }]

Dentro:

mapO = { 1: 'rod', 2: 'hey' }

Eso es lo que probé:

let mapIdName = (o) => {
  let ret = {};
  ret[o["id"]] = o['name'];
  return ret;
}

let mergeIdNames = R.mergeAll(R.map(mapIdName));

mergeIdNames(o)

Con el error:

mergeIdNames is not a function

2
Rodrigo 12 ago. 2016 a las 17:22

2 respuestas

La mejor respuesta

Puede utilizar R.indexBy:

> R.map(R.prop('name'), R.indexBy(R.prop('id'), [{id: 1, name: 'rod'}, {id: 2, name: 'hey'}]))
{'1': 'rod', '2': 'hey'}

Como una función:

//    f :: Array { id :: String, name :: a } -> StrMap a
const f = R.pipe(R.indexBy(R.prop('id')), R.map(R.prop('name')));

f([{id: 1, name: 'rod'}, {id: 2, name: 'hey'}]);
// => {'1': 'rod', '2': 'hey'}
7
davidchambers 12 ago. 2016 a las 20:16

Incluso el uso de Reducir conduce a un código bastante conciso y legible:

reduce((acc, curr) => 
   R.assoc(curr.id, curr.name, acc), {}, arr)

O si se usa como función:

const f = R.reduce((acc, curr) => 
   R.assoc(curr.id, curr.name, acc), {})
1
jgr0 4 feb. 2017 a las 14:12