2016-08-12 24 views
2

对象的数组映射到一个单一的对象,我需要把这个:如何使用Ramda

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

到:

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

这就是我想:

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

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

mergeIdNames(o) 

与错误:

mergeIdNames is not a function

回答

5

你可以使用R.indexBy

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

作为一个功能:

// 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'} 
+0

酷男!谢谢! – Rodrigo

0

即使使用减少导致相当简洁,可读的代码:

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

或者如果用作功能:

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