2017-12-21 4 views
0

を検索して:文字列「鍼治療」に基づきは、ネストされたJSONをループネストされた子は、私はこのようになります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 
      } 
      } 
     }] 

を、私は値とデータ型を抽出する必要があります。データセットは非常に大きく、数百のサブカテゴリがあります。私はこのデータを検索する良い方法を見つけることができません。 json-pathとadvanced-json-pathを試しましたが、子要素の検索を行うと、親を返す方法がありません。私は私の出力は次のようになりたい:

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

私は既存のライブラリでこれを行う簡単な方法があった望んで、または少なくとも単純なループとされました。

+0

[Javascript objects:get parent](https://stackoverflow.com/questions/2980763/javascript-objects-get-parent)の可能な複製 –

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

+0

これは本当にうまく見えますが、私の実際のライブJsonコールはこのような空のコンテナ配列内の配列を返しています [[{"changeDate": "2017-10-13T20:26:13.000 + 0000"など} ]] 空のコンテナ配列を渡すにはどうすればよいですか? –

+0

外部配列の問題を取り除いているようですが、まだこのエラーが出ているようです。値:treatment.value、:TypeError:未定義のプロパティ 'value'を読み取ることができません –

+0

これは 'find' isn '何も返さないことを意味します。 、それで'はそのサブカテゴリで1つを見つけることができません – user184994

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)

0

あなたはArray.prototype.map()と組み合わせるArray.prototype.filter()を使用して、必要な構造を持つオブジェクトの配列を作成することができます。ここでは例を示します。

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

まずフィルタ機能をパラメータとしてその関数を受けている、あなたの配列をフィルタリングし、「鍼治療」に関連した項目のみを返し、その後、マップ機能します配列内の各項目に対して実行され、新しい構造体が返され、必要なフィールドだけが返されます。

関連する問題