2016-08-12 68 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), {})