如何基于多个属性聚合和合并对象?

问题描述 投票:-1回答:1

我需要您的支持才能在Ramda进行分组。

我有数据,我需要:

  1. 按服务类型对数据进行排序
  2. 分隔相同的产品代码
  3. 进行持续时间分组
  4. 合并所有数据

数据:

[{
    '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
javascript ramda.js
1个回答
0
投票

我将为此任务使用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>
© www.soinside.com 2019 - 2024. All rights reserved.