首页 > 解决方案 > 如何按一个键分组并用 Ramda 对其他键求和?

问题描述

假设我有一个这样的对象数组:

[
{'prop_1': 'key_1', 'prop_2': 23, 'prop_3': 45},
{'prop_1': 'key_1', 'prop_2': 56, 'prop_3': 10},
{'prop_1': 'key_2', 'prop_2': 10, 'prop_3': 5},
{'prop_1': 'key_2', 'prop_2': 6, 'prop_3': 7}
]

我想按第一个属性分组并对其他属性的值求和,得到一个像这样的数组:

[
{'prop_1': 'key_1', 'prop_2': 79, 'prop_3': 55},
{'prop_1': 'key_2', 'prop_2': 16, 'prop_3': 12}
]

使用 Ramda 的正确方法是什么?我尝试使用以下内容:

R.pipe(
R.groupBy(R.prop('prop_1')),
R.values,
R.reduce(R.mergeWith(R.add), {})
)

但这也将“prop_1”的值相加。

标签: ramda.js

解决方案


当且当您提前知道密钥时,您可以选择“更简单”的东西(当然是 YMMV):

  • reduceBy采用类似于Array#reduce
  • 用作prop('prop_1')“分组依据”子句

(从对象中提取值以获得最终数组应该相对简单。)

console.log(

reduceBy
  ( (acc, obj) =>
      ({ prop_1: obj.prop_1
       , prop_2: acc.prop_2 + obj.prop_2
       , prop_3: acc.prop_3 + obj.prop_3
       })
  // acc initial value
  , { prop_1: ''
    , prop_2: 0
    , prop_3: 0
    }
  // group by clause
  , prop('prop_1')
  , data
  )

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.min.js"></script>
<script>const {reduceBy, prop} = R;</script>
<script>
const data = [{'prop_1': 'key_1', 'prop_2': 23, 'prop_3': 45}, {'prop_1': 'key_1', 'prop_2': 56, 'prop_3': 10}, {'prop_1': 'key_2', 'prop_2': 10, 'prop_3': 5}, {'prop_1': 'key_2', 'prop_2': 6, 'prop_3': 7}];
</script>


推荐阅读