javascript - 如何基于多个属性聚合和合并对象?
问题描述
我需要你的支持才能在 Ramda 中进行 groupby。
我有一个数据,我需要:
- 按服务类型对数据进行排序
- 将相同产品代码的产品分开
- 制作持续时间的 groupby
- 合并所有数据
数据:
[{
'id': '1', 'serviceType': { 'description': 'GE' },
'productCode': 'codeTwo', 'duration': { 'months': 24 },
}, {
'id': '2', 'serviceType': { 'description': 'GE' },
'productCode': 'codeOne', 'duration': { 'months': 12 }
}, {
'id': '3', 'serviceType': { 'description': 'RF' },
'productCode': 'codeOne', 'duration': { 'months': 24 },
}, {
'id': '4', 'serviceType': { 'description': 'RF' },
'productCode': 'codeOne', 'duration': { 'months': 12 },
}, {
'id': '5', 'serviceType': { 'description': 'RF' },
'productCode': 'codeOne', 'duration': { 'months': 36 },
}, {
'id': '6', 'serviceType': { 'description': 'GE' },
'productCode': 'codeOne', 'duration': { 'months': 24 }
}]
预期结果:
[{
'serviceType': 'GE',
'productCode': 'codeOne',
'duration': [12,24]
}, {
'serviceType': 'RF',
'productCode': 'codeOne',
'duration': [12,24,36]
}, {
'serviceType': 'GE',
'productCode': 'codeTwo',
'duration': [24]
}]
测试错误:
data.map(item => {
(item.serviceType === 'GE') ? listGE.push(item) : listRF.push(item)
R.compose(
R.values,
R.map(R.head),
R.map(R.prop('duration')),
R.groupBy(m => m.id !== id ? m.id : m.id)
)(listGE)
console.log(listGE);
})
listGE
解决方案
我将reduceBy
用于此任务:
collect
用于对持续时间进行分组key
用于识别一对唯一的服务类型和产品代码
值得注意的是,它collect
做了一些重复,因为它一直在重新分配相同的服务类型和产品代码,但我认为它可以忽略不计。
// merge similar objects
const collect = (acc, obj) => ({
serviceType: obj.serviceType.description,
productCode: obj.productCode,
duration: acc.duration.concat(obj.duration.months)
});
// key generating function used to group similar objects together
const key = obj => `${obj.serviceType.description}-${obj.productCode}`;
// transformation function
const transform = compose(values, reduceBy(collect, {duration:[]}, key));
console.log(
transform(data)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {compose, values, reduceBy} = R;</script>
<script>
const data = [
{ id: '1',
serviceType: { description: 'GE' },
productCode: 'codeTwo',
duration: { months: 24 }},
{ id: '2',
serviceType: { description: 'GE' },
productCode: 'codeOne',
duration: { months: 12 }},
{ id: '3',
serviceType: { description: 'RF' },
productCode: 'codeOne',
duration: { months: 24 }},
{ id: '4',
serviceType: { description: 'RF' },
productCode: 'codeOne',
duration: { months: 12 }},
{ id: '5',
serviceType: { description: 'RF' },
productCode: 'codeOne',
duration: { months: 36 }},
{ id: '6',
serviceType: { description: 'GE' },
productCode: 'codeOne',
duration: { months: 24 }}];
</script>
推荐阅读
- kubernetes - 在 Kubernetes 中根据服务设置环境变量
- html - 删除共享按钮
- javascript - 为什么`keyof any`的类型是`string | 号码 | 打字稿中的符号?
- javascript - 通过 web3.js 调用智能合约函数没有响应
- javascript - JavaScript 仅在类文件名称中包含括号时运行
- sql - 适当的 SELECT 语句
- php - 如何修复预期的响应代码 354 但得到代码“503”
- java - 在 Docker 中运行 Java 12 应用程序
- sql - 如何在一行下转置所有四列并在excel中的四组中重复其余列?
- c# - 设置内容页面图标