【问题标题】:Convert array of objects to plain object using Ramda使用 Ramda 将对象数组转换为普通对象
【发布时间】:2016-08-30 15:32:11
【问题描述】:

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

我有这个

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,我不确定如何避免这里的副作用。

【问题讨论】:

  • 如果我能给你使用 RamdaJS 的 10 分,我会... :+1:

标签: javascript functional-programming ramda.js


【解决方案1】:

Ramda 为此内置了一个函数mergeAll

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

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

【讨论】:

    【解决方案2】:

    由于每个人都已经在使用 ES6 (const),所以有一个不错的纯 ES6 解决方案:

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

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

    【讨论】:

      【解决方案3】:

      改用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

      【讨论】:

      • reduce() 是一个非常有用的建议,尤其是对于更复杂的情况。
      猜你喜欢
      • 2021-11-08
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多