ramda.js - 如何按一个键分组并用 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”的值相加。
解决方案
当且仅当您提前知道密钥时,您可以选择“更简单”的东西(当然是 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>
推荐阅读
- c# - 什么时候创建闭包?
- xamarin.android - 缺少 Xamarin.Android.Things 的共享库
- java - 使用声明式 HTTP 客户端 Junit 5 进行 Micronaut 测试
- azure - 如何使用 CosmosDB SQL API 加入另一个数组中的数组?
- typescript - Webdriver.io / wdio.conf.ts:对象字面量只能指定已知属性,而“配置”类型中不存在“mochaOpts”
- command - Mplayer - 使用命令行更改曲目、播放/暂停
- c++ - 为什么调用构造函数时会出现编译错误?
- javascript - 有没有办法通过 JSFL 脚本请求当前在 Adobe Flash/Animate 中打开的 FLA 文件的文件位置?
- react-native - 取消 Redux-saga 中的所有 saga
- node.js - 如何使用 ngif 使其可以隐藏 div 并且不验证 div 部分下的元素?