假设我有一个像这样的对象数组:
[
{'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'的值。
您需要映射组,然后缩小每个组。检查当前合并键的值。如果值是数字,则添加值。如果不是,则仅返回第一个值:
const { pipe, groupBy, prop, values, map, reduce, mergeWith, ifElse, is, add, identity } = R
const fn = pipe(
groupBy(prop('prop_1')),
values,
map(reduce(
mergeWith(ifElse(is(Number), add, identity)),
{}
))
)
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}]
const result = fn(data)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
如果和仅如果您事先知道密钥,则可以选择“简单”的东西(当然是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>