-2

I have the following JSON response which contains several objects composed of a couple of objects (datacenter, environment) :

"deployments": [
                    {
                        "datacenter": {
                            "title": "euw1",
                            "name": "foodatacenter",
                            "revision": "0",
                            "state": "Active"
                        },
                        "environment": {
                            "clusterId": "AAA",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active",

                        }
                    },
                    {
                        "datacenter": {
                            "title": "apc1",
                            "name": "foodatacenter",
                            "revision": "0",
                            "state": "Active"
                        },
                        "environment": {
                            "clusterId": "BBB",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active"
                        }
                    },
                    {
                        "datacenter": {
                            "title": "euw1",
                            "name": "foodatacenter",
                            "revision": "0",
                            "state": "Active"
                        },
                        "environment": {
                            "clusterId": "BBB",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active"
                        }
                    },
                     {
                        "datacenter": {
                            "title": "use1",
                            "name": "foodatacenter",
                            "revision": "0",
                            "state": "Active"
                        },
                        "environment": {
                            "clusterId": "AAA",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active"
                        }
                    },
                    {
                        "datacenter": {
                            "title": "use2",
                            "name": "foodatacenter",
                            "revision": "0",
                            "state": "Active"
                        },
                        "environment": {
                            "clusterId": "AAA",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active"
                        }
                    },
    ]

What is the best way to group by environment using javascript? The desired JSON result is as follows :

"deployments": [
                    {
                            "clusterId": "AAA",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active",
                            "datacenters":[
                               {
                                 "title": "euw1",
                                 "name": "foodatacenter",
                                 "revision": "0",
                                 "state": "Active"
                               },
                               {
                                 "title": "use1",
                                 "name": "foodatacenter",
                                 "revision": "0",
                                 "state": "Active"
                               },
                               {
                                 "title": "use2",
                                 "name": "foodatacenter",
                                 "revision": "0",
                                 "state": "Active"
                               },
                           ]
                    },
                    {
                            "clusterId": "BBB",
                            "name": "foocluster",
                            "revision": "0",
                            "state": "Active",
                            "datacenters":[
                               {
                                 "title": "euw1",
                                 "name": "foodatacenter",
                                 "revision": "0",
                                 "state": "Active"
                               },
                               {
                                 "title": "apc1",
                                 "name": "foodatacenter",
                                 "revision": "0",
                                 "state": "Active"
                               }
                           ]
                    }

    ]

Your help would be so appreciated. Thank you so much!

Obama
  • 2,586
  • 2
  • 30
  • 49
  • you just have to loop the data and find what you need, then write it out again. There's no magic special sauce, or SQL-like syntax or anything to find stuff. Have you done anything so far? – ADyson Apr 30 '18 at 12:41
  • 1
    Possible duplicate of [Access / process (nested) objects, arrays or JSON](https://stackoverflow.com/questions/11922383/access-process-nested-objects-arrays-or-json) – Liam Apr 30 '18 at 12:43
  • @Liam no comment, check this https://stackoverflow.blog/2018/04/26/stack-overflow-isnt-very-welcoming-its-time-for-that-to-change/ – Obama Apr 30 '18 at 12:47
  • Well you're not a new user. I also pretty much disagree with most of what that link says ([and I'm not the only one](https://meta.stackoverflow.com/questions/366875/policing-in-the-aftermath-of-the-blog-post-of-welcomingness)). If you want my help put some effort in yourself. – Liam Apr 30 '18 at 13:49

2 Answers2

2

I don't see any option other than looping on the array and collecting datacenter objects by environment. In pseudo-code, this will be:

  1. for each object in the array
    1. key = JSON.stringify(o.environment);
    2. find key in a dictionary.
    3. if key is not found, add it, and add an array as value
    4. add datacenter to the array for key
  2. create a result array
  3. for each item in dictionary
    1. create an environment from the key
    2. create an item in the result, with the fields from the environment and the datacenter objects in the value.
Tsahi Asher
  • 1,767
  • 15
  • 28
1

You can use array#reduce to group the data based on environment clusterId in an object and add all the datacenter corresponding to similar clusterId and then extract the values from the object.

const data = {"deployments": [ { "datacenter": { "title": "euw1", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "AAA", "name": "foocluster", "revision": "0", "state": "Active", } }, { "datacenter": { "title": "apc1", "name":"foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "BBB", "name": "foocluster", "revision": "0", "state": "Active" } }, { "datacenter": { "title": "euw1", "name": "foodatacenter", "revision": "0", "state": "Active" },"environment": { "clusterId": "BBB", "name": "foocluster", "revision": "0", "state": "Active" } }, { "datacenter": { "title": "use1", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "AAA", "name": "foocluster","revision": "0", "state": "Active" } }, { "datacenter": { "title": "use2", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "AAA", "name": "foocluster", "revision": "0", "state": "Active" } }]},
    result = Object.values(data.deployments.reduce((r,{datacenter, environment}) => {
      const key = environment.clusterId;
      r[key] = r[key] || {...environment, datacenters : []};
      r[key].datacenters.push({...datacenter});
      return r;
    },{}));
console.log(result);

"use strict";

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var data = { "deployments": [{ "datacenter": { "title": "euw1", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "AAA", "name": "foocluster", "revision": "0", "state": "Active" } }, { "datacenter": { "title": "apc1", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "BBB", "name": "foocluster", "revision": "0", "state": "Active" } }, { "datacenter": { "title": "euw1", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "BBB", "name": "foocluster", "revision": "0", "state": "Active" } }, { "datacenter": { "title": "use1", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "AAA", "name": "foocluster", "revision": "0", "state": "Active" } }, { "datacenter": { "title": "use2", "name": "foodatacenter", "revision": "0", "state": "Active" }, "environment": { "clusterId": "AAA", "name": "foocluster", "revision": "0", "state": "Active" } }] },
    result = Object.values(data.deployments.reduce(function (r, o) {
  var datacenter = o.datacenter,
      environment = o.environment;

  var key = environment.clusterId;
  r[key] = r[key] || _extends({}, environment, { datacenters: [] });
  r[key].datacenters.push(_extends({}, datacenter));
  return r;
}, {}));
console.log(result);
Hassan Imam
  • 21,956
  • 5
  • 41
  • 51
  • Hello @Hassan Imam i'm facing errors when using YUI Compressor with this code. For example it doesn't like passing an object to reduce anonymous function {datacenter, environment}, also to errors in line 4 and 5 . How can i write the same code to be correctly compressed http://refresh-sf.com/ ? Thank you so much! – Obama May 07 '18 at 10:10
  • Hi @Obama, I have added ES5 solution. – Hassan Imam May 08 '18 at 09:31