汇总 JSON 数据 javascript

aggregating JSON data javascript

抱歉冗长 post。

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

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

所以我需要根据 'plan'、'coverageName' 和 'serviceName' 进行聚合(分组依据)。

结果是 JSON 个对象的数组,格式如下。基本上可以有多个plan,每个plan可以有多个'coverage',每个'coverage'可以有多个'service',每个'service'可以有多个'details' 如 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
 }
]

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

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

我认为这可能是我之前实现的 Underscore 版本。 顺便说一句,如果你想玩,这里是 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>