首页 > 解决方案 > 使用 JavaScript 为嵌套对象操作 JSON 数据

问题描述

我最近开始在节点 JS 中工作,并且一直在处理 JSON 数据。给定 DATA 为:

"paymentTypeReason": [
    {
        "CATEGORY_NAME": "CDA Portfolio Submission Fee",
        "AMOUNT": 150,
        "GROUP_NAME": "",
        "SORT_ORDER": 100
    },
    {
        "CATEGORY_NAME": "Duplicate Diploma Request fee",
        "AMOUNT": 25,
        "GROUP_NAME": "",
        "SORT_ORDER": 200
    },
    {
        "CATEGORY_NAME": "Divine Nine Alliance (DNA)",
        "AMOUNT": 40,
        "GROUP_NAME": "Student Organizations",
        "SORT_ORDER": 300
    },
    {
        "CATEGORY_NAME": "Divine Nine Alliance (DNA) Annual Dues",
        "AMOUNT": 40,
        "GROUP_NAME": "Student Organizations",
        "SORT_ORDER": 400
    },
    {
        "CATEGORY_NAME": "Tau Upsilon for Human Services",
        "AMOUNT": 80,
        "GROUP_NAME": "Honor Societies",
        "SORT_ORDER": 700
    },
    {
        "CATEGORY_NAME": "Phi Alpha Honor Society",
        "AMOUNT": 60,
        "GROUP_NAME": "Honor Societies",
        "SORT_ORDER": 800
    }
]
}
}  

基于组名我必须创建 JSON 数据为

"paymentTypeReason": [
    {
        "CATEGORY_NAME": "CDA Portfolio Submission Fee",
        "AMOUNT": 150,
        "GROUP_NAME": "",
        "SORT_ORDER": 100
    },
    {
        "CATEGORY_NAME": "Duplicate Diploma Request fee",
        "AMOUNT": 25,
        "GROUP_NAME": "",
        "SORT_ORDER": 200
    },
    {
        "categoryName": "Student Organizations",
        "groupName": null,
        "children": [
            {
                "CATEGORY_NAME": "Divine Nine Alliance (DNA)",
                "AMOUNT": 40,
                "GROUP_NAME": "Student Organizations",
                "SORT_ORDER": 300
            },
            {
                "CATEGORY_NAME": "Divine Nine Alliance (DNA) Annual Dues",
                "AMOUNT": 40,
                "GROUP_NAME": "Student Organizations",
                "SORT_ORDER": 400
            }
        ]
    },
    {
        "categoryName": "Honor Societies",
        "groupName": null,
        "sortOrder": 900,
        "children": [
            {
                "CATEGORY_NAME": "Tau Upsilon for Human Services",
                "AMOUNT": 80,
                "GROUP_NAME": "Honor Societies",
                "SORT_ORDER": 700
            },
            {
                "CATEGORY_NAME": "Phi Alpha Honor Society",
                "AMOUNT": 60,
                "GROUP_NAME": "Honor Societies",
                "SORT_ORDER": 800
            },
        ]
    },
]  

如何使用 JavaScript 实现这一点。来自 Java 背景我可以使用 MAP 来做到这一点,但在 JavaScript 中创建它时遇到了困难。
这是我尝试过的代码

for (paymentType of paymentTypes) { 
                        var paymentTypeReason ={};
                        paymentTypeReason.categoryName=paymentType.CATEGORY_NAME;
                        paymentTypeReason.amount = paymentType.AMOUNT;
                        paymentTypeReason.groupName = paymentType.GROUP_NAME;                       
                        paymentTypeReason.sortOrder = paymentType.SORT_ORDER;                                             
                        paymentTypeReason.children = children;
                       // console.log(paymentTypeReason);
                         if(null == paymentTypeReason.groupName || "" == paymentTypeReason.groupName){  
                             // console.log(paymentType);                                                         
                             resultReasons.push(paymentTypeReason);
                         } else{ 
                             let childArray = []; 
                             console.log(reasonMap);
                                if(reasonMap.has(paymentTypeReason.groupName)){
                                    console.log("inside if");
                                    console.log(reasonMap)
                                    childArray=reasonMap[paymentTypeReason.groupName]
                                } else{
                                    resultReasons.push({
                                        "categoryName" : paymentTypeReason.groupName,
                                        "groupName": null,
                                        "sortOrder": paymentTypeReason.sortOrder,
                                        "children" : []
                                    })
                                }
                                childArray.push(paymentTypeReason);
                                reasonMap[paymentTypeReason.groupName] = childArray                                       
                         }
                     }  

标签: javascriptnode.js

解决方案


Ciao,这样试试:

let input = {"paymentTypeReason": [
            {
                "CATEGORY_NAME": "CDA Portfolio Submission Fee",
                "AMOUNT": 150,
                "GROUP_NAME": "",
                "SORT_ORDER": 100
            },
            {
                "CATEGORY_NAME": "Duplicate Diploma Request fee",
                "AMOUNT": 25,
                "GROUP_NAME": "",
                "SORT_ORDER": 200
            },
            {
                "CATEGORY_NAME": "Divine Nine Alliance (DNA)",
                "AMOUNT": 40,
                "GROUP_NAME": "Student Organizations",
                "SORT_ORDER": 300
            },
            {
                "CATEGORY_NAME": "Divine Nine Alliance (DNA) Annual Dues",
                "AMOUNT": 40,
                "GROUP_NAME": "Student Organizations",
                "SORT_ORDER": 400
            },
            {
                "CATEGORY_NAME": "Tau Upsilon for Human Services",
                "AMOUNT": 80,
                "GROUP_NAME": "Honor Societies",
                "SORT_ORDER": 700
            },
            {
                "CATEGORY_NAME": "Phi Alpha Honor Society",
                "AMOUNT": 60,
                "GROUP_NAME": "Honor Societies",
                "SORT_ORDER": 800
            }
        ]
        }
        
        let groupnames = [...new Set(input.paymentTypeReason.map(el => {
            return el.GROUP_NAME;
        }))]; 
        
         let result = {};
         result.paymentTypeReason = [];
        groupnames.forEach(group => {
           let filter = input.paymentTypeReason.filter(el => el.GROUP_NAME === group);
           if (filter.length > 0) {
              if (filter[0].GROUP_NAME !== "") {
                 let resobj = {};
                 resobj.groupName = null;
                 resobj.categoryName = group;
                 resobj.children = filter;
                 result.paymentTypeReason.push(resobj)
              }
              else {
                 filter.forEach(el => result.paymentTypeReason.push(el))
              }
           }
           
        })
        
        console.log(result)

首先我得到不同的GROUP_NAME。然后对于每个组我过滤input.paymentTypeReason数组,最后我在children数组中找到了元素(GROUP_NAME等于“”除外)。我唯一不明白的是如何创建sortOrder.


推荐阅读