首页 > 解决方案 > 如何在 javascript 对象中分组和创建新属性?

问题描述

我在 javascript 中有一个对象:

 "types": [
    {
      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processX",
      "DocumentCode": 1,
      "DocumentName": "doc1"
    },
    {
      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processX",
      "DocumentCode": 2,
      "DocumentName": "doc2"
    },
    {
      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processX",
      "DocumentCode": 4,
      "DocumentName": "doc4"
    },
   {
      "ProcessCode": "09c27913-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processY",
      "DocumentCode": 1,
      "DocumentName": "doc1"
    },
    {
      "ProcessCode": "09c27913-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processY",
      "DocumentCode": 2,
      "DocumentName": "doc2"
    }
]

如何ProcessCode按此对象分组以使其看起来像这样?

"types": [
    {
      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processX",
      "Docs": [{
        "DocumentCode": 1,
        "DocumentName": "doc1"
        },
        {
        "DocumentCode": 2,
        "DocumentName": "doc2"
        },
        {
        "DocumentCode": 4,
        "DocumentName": "doc4"
        }
     ]
   },
   {
      "ProcessCode": "09c27913-98cf-e711-80f3-1458d0431600",
      "ProcessName": "processY",
      "Docs": [{
        "DocumentCode": 1,
        "DocumentName": "doc1"
       },
       {
        "DocumentCode": 2,
        "DocumentName": "doc2"
       }
     ]
   }
 }
]

我曾尝试使用groupBylodash,但它把​​ ProcessCode 作为关键,而不是我想要的结构。

 "types": [
    {
     "b4919f5a-98cf-e711-80f3-1458d0431600": {...

标签: javascript

解决方案


您可以使用reduce分组功能Object.values和提取分组对象的功能。

let types = [    {      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",      "ProcessName": "processX",      "DocumentCode": 1,      "DocumentName": "doc1"    },    {      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",      "ProcessName": "processX",      "DocumentCode": 2,      "DocumentName": "doc2"    },    {      "ProcessCode": "b4919f5a-98cf-e711-80f3-1458d0431600",      "ProcessName": "processX",      "DocumentCode": 4,      "DocumentName": "doc4"    },   {      "ProcessCode": "09c27913-98cf-e711-80f3-1458d0431600",      "ProcessName": "processY",      "DocumentCode": 1,      "DocumentName": "doc1"    },    {      "ProcessCode": "09c27913-98cf-e711-80f3-1458d0431600",      "ProcessName": "processY",      "DocumentCode": 2,      "DocumentName": "doc2"    }];

let result = Object.values(types.reduce((a, {ProcessCode, ProcessName, DocumentCode, DocumentName}) => {
  (a[ProcessCode] || (a[ProcessCode] = {ProcessCode, ProcessName, Docs: []})).Docs.push({DocumentCode, DocumentName});
  return a;
}, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读