简体   繁体   English

如何使用Ramda将对象数组映射到单个对象

[英]How to map an array of objects to a single object using Ramda

I need to turn this: 我需要把这个:

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

into: 成:

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

That's what I tried: 那就是我尝试过的:

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

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

mergeIdNames(o)

with the error: 与错误:

mergeIdNames is not a function

You could use R.indexBy : 您可以使用R.indexBy

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

As a function: 作为功​​能:

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

Even using Reduce leads to a fairly terse and readable code: 即使使用Reduce也会导致相当简洁易读的代码:

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

Or if used as a function: 或用作功能:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM