通过嵌套子搜索嵌套JSON循环

时间:2017-12-21 19:13:01

标签: javascript

我有一个看起来像这样的JSON结构:

"benefitValues" : [ {
          "changeDate" : "2017-10-13T20:26:13.000+0000",
          "changeUserName" : "aaaa",
          "numericValue" : 20,
          "value" : "20",
          "amountType" : {
            "allowCustomDataFlg" : false,
            "dataType" : "Percent",
            "defaultTypeFlg" : true,
            "defaultValue" : "Unlimited",
            "description" : null,
            "maxValue" : null,
            "minValue" : null,
            "name" : "LIST",
            "benefit" : {
              "category" : "Facility Services",
              "name" : "Single Limit",
              "networkStatus" : "IN_NETWORK",
              "planType" : "MedicalPlan",
              "sortOrder" : 20,
              "subcategory" : "Acupuncture Treatment",
              "subcategorySortOrder" : 6
            }
          }
        }]

根据字符串“Acupuncture Treatment”,我需要提取值和数据类型。数据集非常大,有数百个子类别。我找不到搜索这些数据的好方法。我尝试了json-path和advanced-json-path,但是如果我对子元素进行搜索,我就无法返回父节点。我希望我的输出看起来像这样:

{
          "Subcategory" : "Acupuncture Treatment",
          "Value" : "20",
          "Type" : "Percent"
}

我希望有一种简单的方法可以使用现有的库,或者至少使用一个简单的循环。

3 个答案:

答案 0 :(得分:0)

这将找到benefitValues中的匹配元素,并将元素转换为您期望的格式:



var benefitValues = [{
  "changeDate": "2017-10-13T20:26:13.000+0000",
  "changeUserName": "aaaa",
  "numericValue": 20,
  "value": "20",
  "amountType": {
    "allowCustomDataFlg": false,
    "dataType": "Percent",
    "defaultTypeFlg": true,
    "defaultValue": "Unlimited",
    "description": null,
    "maxValue": null,
    "minValue": null,
    "name": "LIST",
    "benefit": {
      "category": "Facility Services",
      "name": "Single Limit",
      "networkStatus": "IN_NETWORK",
      "planType": "MedicalPlan",
      "sortOrder": 20,
      "subcategory": "Acupuncture Treatment",
      "subcategorySortOrder": 6
    }
  }
}];

// Find the element
let treatment = benefitValues.find((item) => item.amountType.benefit.subcategory === 'Acupuncture Treatment');

let result = {
  Value: treatment.value,
  Subcategory: treatment.amountType.benefit.subcategory,
  Type: treatment.amountType.dataType
}

console.log(result);




答案 1 :(得分:0)

您可以搜索数据集,并使用.filter仅提取与您的字符串匹配的项目。这将为您提供整个对象,因此您可以使用.map将其转换为您想要的结构。

或者如果您只对第一个结果感兴趣,可以改用.find

const json = {"benefitValues" : [{
  "changeDate" : "2017-10-13T20:26:13.000+0000",
  "changeUserName" : "aaaa",
  "numericValue" : 20,
  "value" : "20",
  "amountType" : {
    "allowCustomDataFlg" : false,
    "dataType" : "Percent",
    "defaultTypeFlg" : true,
    "defaultValue" : "Unlimited",
    "description" : null,
    "maxValue" : null,
    "minValue" : null,
    "name" : "LIST",
    "benefit" : {
      "category" : "Facility Services",
      "name" : "Single Limit",
      "networkStatus" : "IN_NETWORK",
      "planType" : "MedicalPlan",
      "sortOrder" : 20,
      "subcategory" : "Acupuncture Treatment",
      "subcategorySortOrder" : 6
    }
  }
}]};

// With filter/map
const result = json.benefitValues
  .filter(val => val.amountType.benefit.subcategory === "Acupuncture Treatment")
  .map(val => ({Subcategory: val.amountType.benefit.subcategory, Value: val.value, Type: val.amountType.dataType}));
  
console.log(result)

// With find / manual transform:
const singleFullResult = json.benefitValues
  .find(val => val.amountType.benefit.subcategory === "Acupuncture Treatment")

const singleResult = {
  Subcategory: singleFullResult.amountType.benefit.subcategory,
  Value: singleFullResult.value,
  Type: singleFullResult.amountType.dataType
}

console.log(singleResult)

答案 2 :(得分:0)

您可以将Array.prototype.filter()Array.prototype.map()结合使用,并使用您需要的结构创建一个对象数组。这是一个例子:

let myArray = [{
    "changeDate": "2017-10-13T20:26:13.000+0000",
    "changeUserName": "aaaa",
    "numericValue": 20,
    "value": "20",
    "amountType": {
        "allowCustomDataFlg": false,
        "dataType": "Percent",
        "defaultTypeFlg": true,
        "defaultValue": "Unlimited",
        "description": null,
        "maxValue": null,
        "minValue": null,
        "name": "LIST",
        "benefit": {
            "category": "Facility Services",
            "name": "Single Limit",
            "networkStatus": "IN_NETWORK",
            "planType": "MedicalPlan",
            "sortOrder": 20,
            "subcategory": "Acupuncture Treatment",
            "subcategorySortOrder": 6
        }
    }
}];

let ret = myArray
                 .filter(arr => arr.amountType.benefit.subcategory === 'Acupuncture Treatment')
                 .map(arr => {
                         return {
                             Subcategory: arr.amountType.benefit.subcategory,
                             Value: arr.value,
                             Type: arr.amountType.dataType
                         };
                  });
console.log(ret);

首先,过滤器功能将过滤您的数组并仅返回与“针灸治疗”相关的项目,然后返回地图函数,该函数接收将为阵列内的每个项目执行的函数作为参数,它将返回新结构,只返回您需要的字段。