JBone
JBone

Reputation: 1826

aggregating JSON data javascript

Sorry for the lengthy post.

Need help with _ aggregation (underscore module) (or anyother better module, or way). I get a ton of JSON objects in an array, and each object have 5 value key pairs:

1) plan, 2) coverageName, 3) serviceName, 4) info, and 5) note. 

So I need to aggregate (group by) based on 'plan', 'coverageName', and 'serviceName'.

The result is array of JSON objects in this below format. Basically there can be multiple plans, and each plan can have multiple 'coverage's, and each 'coverage' can have multiple 'service's and each 'service' can have multiple 'details' as show in the JSON structure.

result = [
{  
  "plan":"Professional",
  "coverage": [
    {
        "name": "Individual",
        "service": [
            {
            "name":"Co-Payment",
            "details": [
                {
                    "info"
                    "note"
                },
                {
                }
                ] //details aray
            },
            {
            "name":"2nd Payment",
            "details": [
                {
                    "info"
                    "note"
                },
                {
                }
                ] //details aray
            }
        ]  //service array
  }

My sample input is this

var regions = [

 {  
  "plan":"Professional",
  "coverageName":"Individual",
  "serviceName":"Co-Payment",
  "info":"In-Network 10  SPECIALIST",
  "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
 },
 {  
  "plan":"Professional",
  "coverageName":"Non-Individual",
  "serviceName":"Co-Insurance",
  "info":"In-Network   COMBINED OFFICE VISIT INCLUDES OFFICE, OTHER DIAGNOSTIC, THERAPY, SUBSTANCE ABUSE, MENTAL NERVOUS, MATERNITY",
  "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
 },
 {  
  "plan":"Professional - Office",
  "coverageName":"Individual",
  "serviceName":"Co-Insurance",
  "info":"In-Network   ",
  "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
 },
 {  
  "plan":"nonProfessional - visit",
  "coverageName":"Individual",
  "serviceName":"Co-Insurance",
  "info":"In-Network   ",
  "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
 },
 {  
  "plan":"nonProfessional - visit",
  "coverageName":"Individual",
  "serviceName":"Co-Insurance",
  "info":"In-Network   ",
  "note":" Certification/Authorization is not required  "
 }
]

I tried to do this in my logic but I did not make much progress

var _ = require('underscore');

var result = _.chain(regions)
.groupBy("plan")
.map(function(value1, key1) {
    return _.chain(value1)
        .groupBy("coverageName")
        .map(function(value2, key2) {
            return _.chain(value2)
            .groupBy("serviceName")
            .map(function (value3, key3) {
                console.log ("\n \n value3 " + JSON.stringify(value3));
            }).value()

        })
        .value(); 
})
.value();

console.log(JSON.stringify(result));

My output for the above input should look like this

[
{  
  "plan":"Professional",
  "coverage": [
    {
        "name": "Individual",
        "service": [
            {
            "name":"Co-Payment",
            "details": [
                {
                    "info":"In-Network 10  SPECIALIST",
                    "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
                }
            ] //details aray
            }
        ]  //service array
  },
  {
    "name": "Non-Individual",
    "service": [
        {
            "name":"Co-Insurance",
            "details": [
                {
                "info":"In-Network   COMBINED OFFICE VISIT INCLUDES OFFICE, OTHER DIAGNOSTIC, THERAPY, SUBSTANCE ABUSE, MENTAL NERVOUS, MATERNITY",
                "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
                }
            ] //details aray
        }]  //service array
  }] //coverage array
},
{  
  "plan":"Professional - Office",
   "coverage": [{
    "name": "Individual",
    "service": [{
        "name":"Co-Insurance",
        "details": [
         {
            "info":"In-Network   ",
            "note":"  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
         }
        ] //details aray
    }]  //service array
  }]
},
{  
  "plan":"nonProfessional - visit",
  "coverage": [
    {
        "name": "Individual",
        "service": [
          { 
            "name":"Co-Insurance",
            "details": [
                {
                    "info":"In-Network   ",
                    "note":" Certification/Authorization is not required  "
                }
            ] //details aray
          }
        ]  //service array
    }
  ] //coverage
 }
]

Upvotes: 1

Views: 427

Answers (2)

Morteza Tourani
Morteza Tourani

Reputation: 3536

I think this can be the Underscore version of my previous implementation. BTW here is the jsfiddle if you wanna play. ;)

var regions = [
{ "plan": "Professional", "coverageName": "Individual", "serviceName": "Co-Payment", "info": "In-Network 10  SPECIALIST", "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "}, 
{ "plan": "Professional", "coverageName": "Non-Individual", "serviceName": "Co-Insurance", "info": "In-Network   COMBINED OFFICE VISIT INCLUDES OFFICE, OTHER DIAGNOSTIC, THERAPY, SUBSTANCE ABUSE, MENTAL NERVOUS, MATERNITY", "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "}, 
{ "plan": "Professional - Office", "coverageName": "Individual", "serviceName": "Co-Insurance", "info": "In-Network   ", "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "}, 
{ "plan": "nonProfessional - visit", "coverageName": "Individual", "serviceName": "Co-Insurance", "info": "In-Network   ", "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "}, 
{ "plan": "nonProfessional - visit", "coverageName": "Individual", "serviceName": "Co-Insurance", "info": "In-Network   ", "note": " Certification/Authorization is not required  "}];

var getServiceInfo = group => _.chain(group)
  .map((v, k) => {
    var result = {
      info: v.info,
      note: v.note
    };
    return result;
  });


var getService = group => _.chain(group)
  .groupBy('serviceName').map((v, k) => {
    var result = {
      name: k,
      details: getServiceInfo(v)
    };
    return result;
  });


var getCoverage = group => _.chain(group)
  .groupBy('coverageName').map((v, k) => {
    var result = {
      name: k,
      service: getService(v)
    };
    return result;
  });


var wrappedObject = _.chain(regions)
  .groupBy('plan').map((v, k) => {
    var result = {
      plan: k,
      coverage: getCoverage(v)
    }
    return result;
  });

var result = JSON.parse(JSON.stringify(wrappedObject));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>

Upvotes: 1

Morteza Tourani
Morteza Tourani

Reputation: 3536

I don't know this is the true answer or not.

var regions = [{
  "plan": "Professional",
  "coverageName": "Individual",
  "serviceName": "Co-Payment",
  "info": "In-Network 10  SPECIALIST",
  "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
}, {
  "plan": "Professional",
  "coverageName": "Non-Individual",
  "serviceName": "Co-Insurance",
  "info": "In-Network   COMBINED OFFICE VISIT INCLUDES OFFICE, OTHER DIAGNOSTIC, THERAPY, SUBSTANCE ABUSE, MENTAL NERVOUS, MATERNITY",
  "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
}, {
  "plan": "Professional - Office",
  "coverageName": "Individual",
  "serviceName": "Co-Insurance",
  "info": "In-Network   ",
  "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
}, {
  "plan": "nonProfessional - visit",
  "coverageName": "Individual",
  "serviceName": "Co-Insurance",
  "info": "In-Network   ",
  "note": "  UM PROGRAM INFORMATION IS NOT CURRENTLY AVAILABLE "
}, {
  "plan": "nonProfessional - visit",
  "coverageName": "Individual",
  "serviceName": "Co-Insurance",
  "info": "In-Network   ",
  "note": " Certification/Authorization is not required  "
}];

var outObj = {};

regions.forEach(rg => {
  var plan = rg.plan,
    coverage = rg.coverageName,
    service = rg.serviceName
  if (!outObj[plan])
    outObj[plan] = {
      plan: plan,
      coverage: {}
    };
  plan = outObj[plan];
  if (!plan.coverage[coverage])
    plan.coverage[coverage] = {
      name: coverage,
      service: {}
    };
  coverage = plan.coverage[coverage];
  if (!coverage.service[service])
    coverage.service[service] = [];
  service = coverage.service[service];
  service.push({
    info: rg.info,
    note: rg.note
  });
});

function _getServices(coverage) {

  return Object.keys(coverage.service).map(srvName => ({
    name: srvName,
    details: coverage[srvName]
  }));
}

function _getCoverage(plan) {
  return Object.keys(plan.coverage).map(cvrName => {
    var coverage = plan.coverage[cvrName]
    return {
      name: cvrName,
      service: _getServices(coverage)
    };
  });
}

var out = Object.keys(outObj).map(planName => {
  var plan = outObj[planName];
  return {
    name: planName,
    coverage: _getCoverage(plan)
  }
});

console.log(out);

Upvotes: 1

Related Questions