javascript - 如何在 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"
}
]
}
}
]
我曾尝试使用groupBy
lodash,但它把 ProcessCode 作为关键,而不是我想要的结构。
"types": [
{
"b4919f5a-98cf-e711-80f3-1458d0431600": {...
解决方案
您可以使用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; }
推荐阅读
- haskell - 如何编写这个可以更改记录的任何项目的简单 Monad?
- javascript - 如何将数据从 JSON 文件附加到 HTML div?
- android - 如何测试系统服务?
- angular - 如何使用 Echo 和 Angular 修复刷新错误
- c - 使用 C 将 Linux 客户端连接到 MacOS 服务器
- php - PHP表单动作和方法进入Jquery
- ubuntu - 如何通过 ubuntu 终端在 chrome 网络浏览器中打开 html 文件?
- ios - 在 swift 4 中实施签入政策
- python-3.x - 在使用 python 和 chromedriver 的硒控制窗口中按 F12
- batch-file - 如何压缩大量变量?