Home > Software engineering >  How to change the format of an array of objects based on ParentID
How to change the format of an array of objects based on ParentID

Time:07-22

I am trying to change the format of an array of objects based on a field called ParentID.

Here is a sample of data:

var JsonVal = "data": {
                "Factorid": 197325,
                "orders": [
                    {
                        "pID": 794522,
                        "Count": 1,
                        "ParentID": 794551,
                        "Description": "",
                        "productid": "1428539",
                        "UnitPrice": "300000",
                    },
                    {
                        "pID": 794525,
                        "Count": 1,
                        "ParentID": 794551,
                        "Description": "",
                        "productid": "1428543",
                        "UnitPrice": "600000",
                    },
                    {
                        "pID": 794550,
                        "Count": 2,
                        "ParentID": 0,
                        "Description": "",
                        "productid": "1428648",
                        "UnitPrice": "60000",
                    },
                    {
                        "pID": 794551,
                        "Count": 1,
                        "ParentID": 0,
                        "Description": "",
                        "productid": "1428647",
                        "UnitPrice": "250000",
                    } ,         
                    {
                        "pID": 794526,
                        "Count": 3,
                        "ParentID": 794550,
                        "Description": "",
                        "productid": "1428548",
                        "UnitPrice": "600000",
                       
                    },
                    {
                        "pID": 794527,
                        "Count": 1,
                        "ParentID": 0,
                        "Description": "",
                        "productid": "1428542",
                        "UnitPrice": "400000",
                       
                    },
                ]
            }

As you can see every object has a ParentID. I want to say that if ParentID is 0, it will be known as a parent and add a field call children which its value is null. However if ParentID is not 0 , it will mean that this Object is a child of another Object that its pID is the same as ParentID child Object.The final JSON should be like this :

"data": {
                "Factorid": 197325,
                "orders": [
                    {
                        "pID": 794550,
                        "Count": 2,
                        "ParentID": 0,
                        "Description": "",
                        "productid": "1428648",
                        "UnitPrice": "60000",
                        "children": "[{
                            'pID': 794526,
                            'Count':3,
                            'ParentID': 794550,
                            'Description': '',
                            'productid': '1428548',
                            'UnitPrice': '600000',                         
                        }]",
                    },
                    {
                        "pID": 794551,
                        "Count": 1,
                        "ParentID": 0,
                        "Description": "",
                        "productid": "1428647",
                        "UnitPrice": "250000",
                        "children":"[
                            {
                               'pID': 794522,
                                'Count': 1,
                                'ParentID': 794551,
                                'Description': '',
                                'productid': '1428539',
                                'UnitPrice': '300000',
                            },
                            {
                               'pID': 794525,
                                'Count': 1,
                                'ParentID': 794551,
                                'Description': '',
                                'productid': '1428543',
                                'UnitPrice': '600000',
                            },
                        ]",
                    } ,         
                    {
                        "pID": 794527,
                        "Count": 1,
                        "ParentID": 0,
                        "Description": "",
                        "productid": "1428542",
                        "UnitPrice": "400000",
                        "children":"",
                       
                    },
                ]
            }

children should be added to any object which is parent and also children is always a string field. I wrote a code but I do not know how to handle it?

JsonVal.orders.forEach(orders => {
  if(orders.ParentID == 0){
       orders.children="";
   }else{
     if(orders.ParentID == new_rows){
        JsonVal.orders = JsonVal.orders.filter(item => item.ParentID == orders.ParentID);
     }
   }
 });

CodePudding user response:

You basically filter your list of orders if it is a "rootOrder" which means that it has one or multiple children. Next, you filter your list again by matching the ParentId to the root.pID

// input
const JsonVal = {
  data: {
    Factorid: 197325,
    orders: [
      {
        pID: 794522,
        Count: 1,
        ParentID: 794551,
        Description: "",
        productid: "1428539",
        UnitPrice: "300000",
      },
      {
        pID: 794525,
        Count: 1,
        ParentID: 794551,
        Description: "",
        productid: "1428543",
        UnitPrice: "600000",
      },
      {
        pID: 794550,
        Count: 2,
        ParentID: 0,
        Description: "",
        productid: "1428648",
        UnitPrice: "60000",
      },
      {
        pID: 794551,
        Count: 1,
        ParentID: 0,
        Description: "",
        productid: "1428647",
        UnitPrice: "250000",
      },
      {
        pID: 794526,
        Count: 3,
        ParentID: 794550,
        Description: "",
        productid: "1428548",
        UnitPrice: "600000",
      },
      {
        pID: 794527,
        Count: 1,
        ParentID: 0,
        Description: "",
        productid: "1428542",
        UnitPrice: "400000",
      },
    ],
  },
};

function mapOrders(orders) {
  const rootOrders = orders.filter((order) => order.ParentID === 0);

  return rootOrders.map((rootOrder) => {
    const children = orders.filter((order) => order.ParentID === rootOrder.pID);

    return {
      ...rootOrder,
      children: children.length ? children : "",
    };
  });
}

// output
const mappedJsonVal = {
  ...JsonVal,
  data: {
    ...JsonVal.data,
    orders: mapOrders(JsonVal.data.orders),
  },
};
  • Related