聚合JSON数据javascript

时间:2016-06-25 23:11:54

标签: javascript underscore.js aggregate

很抱歉这篇冗长的帖子。

需要帮助_聚合(下划线模块)(或任何其他更好的模块或方式)。我在数组中获得了大量的JSON对象,每个对象都有5个值键对:

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

所以我需要根据'plan','coverageName'和'serviceName'聚合(分组)。

结果是以下格式的JSON对象数组。基本上可以有多个计划,每个计划可以有多个“覆盖”,每个“覆盖”可以有多个“服务”,每个“服务”可以有多个“详细信息”,如JSON结构中所示。

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
  }

我的示例输入是

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 _ = 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));

上述输入的输出应该如下所示

[
{  
  "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
 }
]

2 个答案:

答案 0 :(得分:1)

我不知道这是不是真的答案。

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);

答案 1 :(得分:1)

我认为这可能是我之前实现的Underscore版本。 如果你想玩,BTW这里是jsfiddle。 ;)

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>