使用 ramda.js 将对象数组转换为一个对象

n06*_*rin 5 javascript functional-programming ramda.js

我有一个数组:

var a = [
    {id: 1, val: 'a'},
    {id: 2, val: 'b'},
    {id: 3, val: 'c'},
    {id: 4, val: 'd'},
]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

var b = {
    1: 'a',
    2: 'b',
    3: 'c',
    4: 'd',
}
Run Code Online (Sandbox Code Playgroud)

实际上我使用的是纯js:

var b = a.reduce(
    (ac, pr) => ({
      ...ac,
      [pr.id]: pr.val,
    }),
    {}
  );
Run Code Online (Sandbox Code Playgroud)

但也许 Ramda.js 有一些特别的东西?

cнŝ*_*ŝdk 6

您正在寻找 Ramda 的.mergeAll()方法

var b = R.mergeAll(a.map(function(o) {
  return {
    [o.id]: o.val
  }
}));
Run Code Online (Sandbox Code Playgroud)

.map()调用将从每个项目返回自定义对象,仅取值,然后.mergeAll()将它们合并array为一个object

mergeAll文件

将一组对象合并为一个对象。

演示:

var b = R.mergeAll(a.map(function(o) {
  return {
    [o.id]: o.val
  }
}));
Run Code Online (Sandbox Code Playgroud)
var a = [{
    id: 1,
    val: 'a'
  },
  {
    id: 2,
    val: 'b'
  },
  {
    id: 3,
    val: 'c'
  },
  {
    id: 4,
    val: 'd'
  },
];


var b = R.mergeAll(a.map(function(o) {
  return {
    [o.id]: o.val
  }
}));
console.log(b);
Run Code Online (Sandbox Code Playgroud)


Fre*_*and 6

如果还有人路过这里,确实是:

R.indexBy(R.prop('id'), someArray);
Run Code Online (Sandbox Code Playgroud)

请参阅 Ramda 文档中的 indexBy

编辑:班纳特是正确的。如果我们想要val作为每个键的唯一值,我们可以在之后“拔出”它:

const createValDict = R.pipe(
  R.indexBy(R.prop('id')),
  R.pluck('val')
)

const valDict = createValDict(myArr)
Run Code Online (Sandbox Code Playgroud)

拔力也适用于物体


Nin*_*olz 2

Object.assign对于普通的 Javascript,您可以使用、扩展语法...解构赋值Array#map简写属性的组合。

var a = [{ id: 1, val: 'a' }, { id: 2, val: 'b' }, { id: 3, val: 'c' }, { id: 4, val: 'd' }],
    result = Object.assign(...a.map(({ id, val }) => ({ [id]: val })));

console.log(result);
Run Code Online (Sandbox Code Playgroud)