使用 Ramda 将对象数组转换为普通对象

Convert array of objects to plain object using Ramda

如何将对象数组转换为普通对象? 其中数组的每一项都是一个只有一对 key:value 的对象,并且键的名称未知。

我有这个

const arrayOfObject = [
    {KEY_A: 'asfas'},
    {KEY_B: 'asas' }
]
let result = {} 
const each = R.forEach((item) => {
   const key = R.keys(item)[0]
    result[key] = item[key]
})
return result

但我不喜欢该解决方案,因为 forEach 使用全局变量 result,我不确定如何避免此处的副作用。

改为使用 reduce:

const arrayOfObject = [
     {KEY_A: 'asfas'}
    ,{KEY_B: 'asas' }
];
const each = R.reduce((acc,value) => { 
   const key = R.keys(value)[0];
   acc[key] = value[key];

   return acc;
},{},arrayOfObject);

由于您的数组是一个对象数组,您也可以在 reduce 中调用 merge:

const each2 = R.reduce((acc,value) => R.merge(value,acc),{},arrayOfObject);

这是包含两个示例的 jsbin: http://jsbin.com/mifohakeru/edit?js,console,output

Ramda 为此内置了一个函数,mergeAll

const arrayOfObject = [
     {KEY_A: 'asfas'}
    ,{KEY_B: 'asas' }
];

R.mergeAll(arrayOfObject); 
//=> {"KEY_A": "asfas", "KEY_B": "asas"}

因为每个人都已经在使用 ES6 (const),所以有一个很好的纯 ES6 解决方案:

const arrayOfObject = [
  {KEY_A: 'asfas'},
  {KEY_B: 'asas'}
];

Object.assign({}, ...arrayOfObject);
//=> {KEY_A: "asfas", KEY_B: "asas"}

Object.assing将提供的对象合并到第一个对象,...用于将数组扩展到参数列表。