我想在创建一个javascript函数来对JSON元素进行分组方面得到帮助



我有policyTree中提到的这种格式的JSON数据,如下所示

let policyTree = [
{"serviceType": "pcf-sm","policyProject": "Policy_001","policy":"Nchf_001"},
{"serviceType": "pcf-sm", "policyProject": "Policy_001","policy":"PRA_001"},
{"serviceType": "pcf-sm", "policyProject" : "Policy_002","policy":"main"},
{"serviceType": "pcf-ue", "policyProject": "Policy_003", "policy":"ET_001"},
{"serviceType": "pcf-ue", "policyProject" : "abc", "policy": "main"}
]

我需要转换如下块所示的数据。我正在尝试获得如下输出。正在寻找一个javascript函数来完成这项工作。

[
{
"serviceType": "pcf-sm",
"policyProject": [
{
"name": "Policy_001",
"policies": [
"main",
"Nchf_001",
"PRA_001",
]
},
{
"name": "Policy_002",
"policies": [
"main"
]
}
]
},
{
"serviceType": "pcf-ue",
"policyProject": [
{
"name": "Policy_003",
"policies": [
"ET_001"
]
},
{
"name": "abc",
"policies": [
"main"
]
}
]
}
]

我尝试了以下方法来实现它的结构,我尝试了对serviceType进行分组,但我也必须用它的策略对policyProject进行分组

let policyTree = [
{"serviceType": "pcf-sm","policyProject": "Policy_001","policy":"Nchf_001"},
{"serviceType": "pcf-sm", "policyProject": "Policy_001","policy":"PRA_001"},
{"serviceType": "pcf-sm", "policyProject" : "Policy_001","policy":"main"},
{"serviceType": "pcf-ue", "policyProject": "Policy_002", "policy":"ET_001"},
{"serviceType": "pcf-ue", "policyProject" : "abc", "policy": "main"}
]
console.log(
Object.values(policyTree.reduce((a, { serviceType, policyProject, policy }) => {
if (!a[serviceType]) a[serviceType] = { serviceType, policyProject: [], };
a[serviceType].policyProject.push({"name": policyProject, "policies": [policy]}); 
return a;
}, {}))
);

我已经为您编写了一个脚本来实现这一点,我认为它符合您的需求,希望它能有所帮助!

let policyTree = [
{ serviceType: 'pcf-sm', policyProject: 'Policy_001', policy: 'Nchf_001' },
{ serviceType: 'pcf-sm', policyProject: 'Policy_001', policy: 'PRA_001' },
{ serviceType: 'pcf-sm', policyProject: 'Policy_002', policy: 'main' },
{ serviceType: 'pcf-ue', policyProject: 'Policy_003', policy: 'ET_001' },
{ serviceType: 'pcf-ue', policyProject: 'abc', policy: 'main' },
];
let result = policyTree.reduce((results, input) => {
const existingServiceType = results.find(
(c) => c.serviceType === input.serviceType
);
if (existingServiceType) {
const existingPolicyProjectIndex = existingServiceType.policyProject.findIndex(
(p) => p.name === input.policyProject
);
if (existingPolicyProjectIndex !== -1) {
existingServiceType.policyProject[
existingPolicyProjectIndex
].policies.push(input.policy);
} else {
existingServiceType.policyProject.push({
name: input.policyProject,
policies: [input.policy],
});
}
} else {
results.push({
serviceType: input.serviceType,
policyProject: [
{
name: input.policyProject,
policies: [input.policy],
},
],
});
}
return results;
}, []);
console.log(result);

最新更新