用 Ramda 统一一个对象的信息

Unify information about an object with Ramda

我需要您的支持才能在 ramda 中生成以下结果。

我已经采取了一些方法并取得了这些结果,但现在我需要的是通过生成以下结果的 productCode 进行合并,其中 serviceType 将是一个按持续时间排序和关联的数组:

DATA

data = [
    {
            "id": "ck5ii4ysl04vn0744z7liu0f3",
            "pdvIntegrationStatus": "WAITING",
            "sapIntegrationStatus": "WAITING",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "CEL",
                    "description": "Celular e Smartphones"
            },
            "serviceType": {
                    "code": "RF",
                    "description": "descrição SEGURO ROUBO OU FURTO"
            },
            "productCode": "4004593",
            "duration": [
                    24,
                    12
            ]
    },
    {
            "id": "ck5ii4yr704vc0744sjw3tljd",
            "pdvIntegrationStatus": "WAITING",
            "sapIntegrationStatus": "WAITING",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "CEL",
                    "description": "Celular e Smartphones"
            },
            "serviceType": {
                    "code": "GE",
                    "description": "descrição da garantia estendida"
            },
            "productCode": "4004593",
            "duration": [
                    12
            ]
    },
    {
            "id": "ck5ii4yr704vc0744sjw3tljr",
            "pdvIntegrationStatus": "INTEGRATED",
            "sapIntegrationStatus": "INTEGRATED",
            "updatedAt": "2020-01-18T15:34:09.000Z",
            "category": {
                    "code": "DUC",
                    "description": "Duchas e chuveiros"
            },
            "serviceType": {
                    "code": "GE",
                    "description": "descrição da garantia estendida"
            },
            "productCode": "4004594",
            "duration": [
                    24
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f6",
            "pdvIntegrationStatus": "WAITING",
            "sapIntegrationStatus": "INTEGRATED",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "DUC",
                    "description": "Duchas e chuveiros"
            },
            "serviceType": {
                    "code": "RF",
                    "description": "descrição SEGURO ROUBO OU FURTO"
            },
            "productCode": "4004596",
            "duration": [
                    24,
                    12
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f0",
            "pdvIntegrationStatus": "INTEGRATED",
            "sapIntegrationStatus": "WAITING",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "CEL",
                    "description": "Celular e Smartphones"
            },
            "serviceType": {
                    "code": "GE",
                    "description": "descrição da garantia estendida"
            },
            "productCode": "4004595",
            "duration": [
                    12
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f1",
            "pdvIntegrationStatus": "INTEGRATED",
            "sapIntegrationStatus": "INTEGRATED",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "DUC",
                    "description": "Duchas e chuveiros"
            },
            "serviceType": {
                    "code": "GE",
                    "description": "descrição da garantia estendida"
            },
            "productCode": "4004596",
            "duration": [
                    12
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f2",
            "pdvIntegrationStatus": "INTEGRATED",
            "sapIntegrationStatus": "INTEGRATED",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "VENT",
                    "description": "Ventiladores"
            },
            "serviceType": {
                    "code": "GE",
                    "description": "descrição da garantia estendida"
            },
            "productCode": "4004597",
            "duration": [
                    24
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f4",
            "pdvIntegrationStatus": "INTEGRATED",
            "sapIntegrationStatus": "INTEGRATED",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "DUC",
                    "description": "Duchas e chuveiros"
            },
            "serviceType": {
                    "code": "RF",
                    "description": "descrição SEGURO ROUBO OU FURTO"
            },
            "productCode": "4004594",
            "duration": [
                    12
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f5",
            "pdvIntegrationStatus": "WAITING",
            "sapIntegrationStatus": "WAITING",
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "category": {
                    "code": "CEL",
                    "description": "Celular e Smartphones"
            },
            "serviceType": {
                    "code": "RF",
                    "description": "descrição SEGURO ROUBO OU FURTO"
            },
            "productCode": "4004595",
            "duration": [
                    24
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f9",
            "pdvIntegrationStatus": "WAITING",
            "sapIntegrationStatus": "WAITING",
            "updatedAt": "2020-01-17T15:34:13.000Z",
            "category": {
                    "code": "VENT",
                    "description": "Ventiladores"
            },
            "serviceType": {
                    "code": "RF",
                    "description": "descrição SEGURO ROUBO OU FURTO"
            },
            "productCode": "4004597",
            "duration": [
                    24
            ]
    }
 ]

RESULT EXPECTED

resultExpected = [
    {
            "id": "ck5ii4ysl04vn0744z7liu0f3",
            "productCode": "4004593",
            "category": {
                    "code": "CEL",
                    "description": "Celular e Smartphones"
            },
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "pdvIntegrationStatus": false,
            "sapIntegrationStatus": false,
            "serviceType": [
                    {
                            "code": "GE",
                            "description": "descrição da garantia estendida"
                    },{
                            "code": "RF",
                            "description": "descrição SEGURO ROUBO OU FURTO"
                    }
            ],
            "duration_GE": [
                    12
            ],
            "duration_RF": [
                    24,
                    12
            ]
    },
    {
            "id": "ck5ii4yr704vc0744sjw3tljr",
            "productCode": "4004594",
            "category": {
                    "code": "DUC",
                    "description": "Duchas e chuveiros"
            },
            "updatedAt": "2020-01-18T15:34:09.000Z",
            "pdvIntegrationStatus": true,
            "sapIntegrationStatus": true,
            "serviceType": [
                    {
                            "code": "GE",
                            "description": "descrição da garantia estendida"
                    },
                    {
                            "code": "RF",
                            "description": "descrição SEGURO ROUBO OU FURTO"
                    }
            ],
            "duration_GE": [
                    12
            ],
            "duration_RF": [
                    24
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f0",
            "productCode": "4004595",
            "category": {
                    "code": "CEL",
                    "description": "Celular e Smartphones"
            },
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "pdvIntegrationStatus": true,
            "sapIntegrationStatus": false,
            "serviceType": [
                    {
                            "code": "GE",
                            "description": "descrição da garantia estendida"
                    },
                    {
                            "code": "RF",
                            "description": "descrição SEGURO ROUBO OU FURTO"
                    }
            ],
            "duration_GE": [
                    24
            ],
            "duration_RF": [
                    12
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f6",
            "productCode": "4004596",
            "category": {
                    "code": "DUC",
                    "description": "Duchas e chuveiros"
            },
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "pdvIntegrationStatus": false,
            "sapIntegrationStatus": true,
            "serviceType": [
                    {
                            "code": "GE",
                            "description": "descrição da garantia estendida"
                    }, {
                            "code": "RF",
                            "description": "descrição SEGURO ROUBO OU FURTO"
                    }
            ],
            "duration_GE": [
                    12
            ],
            "duration_RF": [
                    24,
                    12
            ]
    },
    {
            "id": "ck5ii4ysl04vn0744z7liu0f2",
            "productCode": "4004597",
            "category": {
                    "code": "VENT",
                    "description": "Ventiladores"
            },
            "updatedAt": "2020-01-17T18:34:13.075Z",
            "pdvIntegrationStatus": true,
            "sapIntegrationStatus": true,
            "serviceType": [
                    {
                            "code": "GE",
                            "description": "descrição da garantia estendida"
                    },
                    {
                            "code": "RF",
                            "description": "descrição SEGURO ROUBO OU FURTO"
                    }
            ],
            "duration_GE": [
                    24
            ],
            "duration_RF": [
                    24
            ]
    }
]

我已经尝试制作此代码,但持续时间数组会在信息到来时随机保存它,我需要持续时间内的第一个安排用于 "Garantia Extendida",第二个用于 "Robo o Furto" 和知道如何识别它所属的期限安排,例如:

Duration: {GE: ['12', '24'], RF: ['24']}

> const groupByTransaction = R.groupBy(R.prop('productCode'));
>          const mergeToObject = (rows) => Object.values(rows).map( item => (   {    ...R.pickAll(['id'], item[0]),    ...R.pickAll(['productCode'], item[0]),    ...R.pickAll(['category'],
> item[0]),    ...R.pickAll(['updatedAt'], item[0]),   
> pdvIntegrationStatus: R.contains(R.pluck('pdvIntegrationStatus',
> item)[0], 'INTEGRATED'),    sapIntegrationStatus:
> R.contains(R.pluck('sapIntegrationStatus', item)[0], 'INTEGRATED'),   
> serviceType: R.pluck('serviceType', item),    duration_GE:
> (R.pluck('duration', item))[1],    duration_RF: (R.pluck('duration',
> item))[0] } ));
>          const hasDuplicates = R.pipe( groupByTransaction, mergeToObject );
> 
> rows = hasDuplicates(rows);

首先,请求:在发布更多问题之前,请阅读 How to create a Minimal, Reproducible Example。问题中的数据远远超过证明所请求行为所需的数据。数组中的条目比需要的多,而且它们的属性也比需要的多。在输入和所需输出之间来回滚动以尝试了解您在做什么非常乏味,我几乎要放弃了。

在下面的示例中,我减少了属性的数量,但保留了所有条目。其他属性对技术应该没有影响。

所以下次请先创建一个最小的例子再提问。谢谢!


我不太确定你的问题,但我认为这个示例可以满足你的要求:

const combineTypes = (
  {serviceType: allTypes, ... base}, 
  {id, serviceType, duration, ... rest}
) => ({
  ... rest,
  serviceType: [... allTypes, serviceType],
  ... base,
  [`duration_${serviceType.code}`]: duration
})

const transform = pipe (
  groupBy (prop ('productCode')),
  values,
  map (reduce (combineTypes, {serviceType: []}))
)

const data = [{id: "ck5ii4ysl04vn0744z7liu0f3", serviceType: {code: "RF", description: "descrição SEGURO ROUBO OU FURTO"}, productCode: "4004593", duration: [24, 12]}, {id: "ck5ii4yr704vc0744sjw3tljd", serviceType: {code: "GE", description: "descrição da garantia estendida"}, productCode: "4004593", duration: [12]}, {id: "ck5ii4yr704vc0744sjw3tljr", serviceType: {code: "GE", description: "descrição da garantia estendida"}, productCode: "4004594", duration: [24]}, {id: "ck5ii4ysl04vn0744z7liu0f6", serviceType: {code: "RF", description: "descrição SEGURO ROUBO OU FURTO"}, productCode: "4004596", duration: [24, 12]}, {id: "ck5ii4ysl04vn0744z7liu0f0", serviceType: {code: "GE", description: "descrição da garantia estendida"}, productCode: "4004595", duration: [12]}, {id: "ck5ii4ysl04vn0744z7liu0f1", serviceType: {code: "GE", description: "descrição da garantia estendida"}, productCode: "4004596", duration: [12]}, {id: "ck5ii4ysl04vn0744z7liu0f2", serviceType: {code: "GE", description: "descrição da garantia estendida"}, productCode: "4004597", duration: [24]}, {id: "ck5ii4ysl04vn0744z7liu0f4", serviceType: {code: "RF", description: "descrição SEGURO ROUBO OU FURTO"}, productCode: "4004594", duration: [12]}, {id: "ck5ii4ysl04vn0744z7liu0f5", serviceType: {code: "RF", description: "descrição SEGURO ROUBO OU FURTO"}, productCode: "4004595", duration: [24]}, {id: "ck5ii4ysl04vn0744z7liu0f9", serviceType: {code: "RF", description: "descrição SEGURO ROUBO OU FURTO"}, productCode: "4004597", duration: [24]}];

console .log (
  transform (data)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.min.js"></script>
<script>const {pipe, groupBy, prop, values, map, reduce} = R             </script>

(再次注意,并非您请求的所有属性都包含在输出中。如果它们在输入中,它们应该会正确显示。)

我们删除了其中的 ids。数据对于不同的条目具有不同的 ID,并且没有明确的方法来组合它们。如果我们需要保留它们,我们可以做一些类似于 serviceType.

的事情

核心在combineTypes函数,在transform管道中提供给reducetransform是标准的Ramda代码,我觉得应该比较清楚了。

如果这不能满足您的要求,请在问题中添加一些说明或作为评论。

我是这样得到的:

const mergeToObject = (rows) => Object.values(rows).map(item => ( {
          ...R.pickAll(['id'], item[0]),
          ...R.pickAll(['productCode'], item[0]),
          ...R.pickAll(['category'], item[0]),
          ...R.pickAll(['updatedAt'], item[0]),
          pdvIntegrationStatus: R.contains(R.pluck('pdvIntegrationStatus', item)[0], 'INTEGRATED') &&
          R.contains(R.pluck('pdvIntegrationStatus', item)[1], 'INTEGRATED'),
          sapIntegrationStatus: R.contains(R.pluck('sapIntegrationStatus', item)[0], 'INTEGRATED') &&
          R.contains(R.pluck('sapIntegrationStatus', item)[1], 'INTEGRATED'),
          serviceType_GE: R.contains((R.pluck('serviceType', item), 'GE'))?'descrição da garantia estendida':'',
          serviceType_RF: R.contains((R.pluck('serviceType', item), 'RF'))?'descrição SEGURO ROUBO OU FURTO':'',
          duration_GE: (item[0].serviceType.code === 'GE') ?
          R.sort(sortByDuration, (R.pluck('duration', item))[0]) :
          ((R.pluck('duration', item))[1])?R.sort(sortByDuration, (R.pluck('duration', item))[1]):[] || [],
          duration_RF: (item[0].serviceType.code === 'RF') ?
          R.sort(sortByDuration, (R.pluck('duration', item))[0]) :
          ((R.pluck('duration', item))[1])?R.sort(sortByDuration, (R.pluck('duration', item))[1]):[] || []
} ));

const hasDuplicates = R.pipe( groupByTransaction, mergeToObject );

rows = hasDuplicates(rows);

很明显它的造型干净多了,kkkkkkk....谢谢