2017-04-20 152 views
1

我有以下JSON平JSON轉換成嵌套

{ 
    "rate_cards": [ 
    { 
     "doctor_id": "xxxxxx", 
     "doctor_name": "Dr. Dre", 
     "practice_id": "xxxxx", 
     "is_owner": 0, 
     "policy_id": 1, 
     "policy_name": "GOLD Super Gold", 
     "payor_id": 1, 
     "payor_name": "AMEX", 
     "payor_registration_number": "AMEX123", 
     "payor_contact_email": "[email protected]", 
     "payor_support_number": "PHONE", 
     "payor_logo_url": "url", 
     "doctors_policies_ratecards_id": 1, 
     "ratecard_activation_status": "Pending", 
     "ratecard_id": 1, 
     "ratecard_validity": "2017-04-17T13:16:58.000Z", 
     "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
     "onboarded_status": "Available" 
    }, 
    { 
     "doctor_id": xxxxxx, 
     "doctor_name": "<NAME>", 
     "practice_id": "xxxxxx", 
     "is_owner": 0, 
     "policy_id": 2, 
     "policy_name": "GOLD Super Gold", 
     "payor_id": 1, 
     "payor_name": "AMEX", 
     "payor_registration_number": "AMEX", 
     "payor_contact_email": "[email protected]", 
     "payor_support_number": "<PHONE>", 
     "payor_logo_url": "url", 
     "doctors_policies_ratecards_id": 2, 
     "ratecard_activation_status": "Pending", 
     "ratecard_id": 1, 
     "ratecard_validity": "2017-04-17T13:16:58.000Z", 
     "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
     "onboarded_status": "Available" 
    } 
    ] 
} 

,我想通過基於payor_name將其轉換爲

{ 
    "payors": [ 
     { 
      "payor_id": 1, 
      "payor_name": "AMEX", 
      "payor_registration_number": "AMEX", 
      "payor_contact_email": "[email protected]", 
      "payor_support_number": "<PHONE>", 
      "payor_logo_url": "url", 
      "data": [ 
       { 
        "doctor_id":xxxxx, 
        "doctor_name": "Dr. Dre", 
        "practice_id": xxxxxx, 
        "is_owner": 0, 
        "policy_id": 1, 
        "policy_name": "GOLD Super Gold", 
        "doctors_policies_ratecards_id": 1, 
        "ratecard_activation_status": "Pending", 
        "ratecard_id": 1, 
        "ratecard_validity": "2017-04-17T13:16:58.000Z", 
        "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
        "onboarded_status": "Available" 
       }, 
       { 
        "doctor_id": xxxxxx, 
        "doctor_name": "name", 
        "practice_id": xxxxxxx, 
        "is_owner": 0, 
        "policy_id": 2, 
        "policy_name": "GOLD Super Gold", 
        "doctors_policies_ratecards_id": 2, 
        "ratecard_activation_status": "Pending", 
        "ratecard_id": 1, 
        "ratecard_validity": "2017-04-17T13:16:58.000Z", 
        "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
        "onboarded_status": "Available" 
       } 
      ] 
     } 
    ] 
} 

基本上我組和成爲我的主要參考嵌套結構體。我嘗試使用lodash groupBy並進行轉換,但無法實現上述結構。任何幫助我能做的事情都會很棒。

+0

'payor_name'是不同的。 –

+0

是的。'''payor_name'''可以不同,在這種情況下,一個更多的條目將進入具有相同結構的'''payors''數組中。 –

+0

@NinaScholz編輯了qn .. –

回答

1

您可以通過lodash做到這一點(跳過某些鍵,處理它們) -

var data = { 
 
    "rate_cards": [ 
 
    { 
 
     "doctor_id": "xxxxxx", 
 
     "doctor_name": "Dr. Dre", 
 
     "practice_id": "xxxxx", 
 
     "is_owner": 0, 
 
     "policy_id": 1, 
 
     "policy_name": "GOLD Super Gold", 
 
     "payor_id": 1, 
 
     "payor_name": "Amex", 
 
     "payor_registration_number": "AMEX123", 
 
     "payor_contact_email": "[email protected]", 
 
     "payor_support_number": "PHONE", 
 
     "payor_logo_url": "url", 
 
     "doctors_policies_ratecards_id": 1, 
 
     "ratecard_activation_status": "Pending", 
 
     "ratecard_id": 1, 
 
     "ratecard_validity": "2017-04-17T13:16:58.000Z", 
 
     "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
 
     "onboarded_status": "Available" 
 
    }, 
 
    { 
 
     "doctor_id": "xxxxx", 
 
     "doctor_name": "<NAME>", 
 
     "practice_id": "xxxxxx", 
 
     "is_owner": 0, 
 
     "policy_id": 2, 
 
     "policy_name": "GOLD Super Gold", 
 
     "payor_id": 1, 
 
     "payor_name": "AMEX", 
 
     "payor_registration_number": "AMEX", 
 
     "payor_contact_email": "[email protected]", 
 
     "payor_support_number": "<PHONE>", 
 
     "payor_logo_url": "url", 
 
     "doctors_policies_ratecards_id": 2, 
 
     "ratecard_activation_status": "Pending", 
 
     "ratecard_id": 1, 
 
     "ratecard_validity": "2017-04-17T13:16:58.000Z", 
 
     "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
 
     "onboarded_status": "Available" 
 
    } 
 
    ] 
 
}; 
 

 
var newdata = _.reduce(data.rate_cards, 
 
    function(arr, item){ 
 
     var index = _.findIndex(arr, { "payor_id" : item.payor_id}); 
 
     if(index > -1){ 
 
     arr[index].data.push(item); 
 
     } else { 
 
     arr.push({ "payor_id" : item.payor_id, "data" : [item] }); 
 
     } 
 
    return arr; 
 
    }, 
 
    [] 
 
    ); 
 
    
 
console.log({ "payors" : newdata});
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

發現這是最優雅的 –

0

在普通的JavaScript,你可以使用一個哈希表作爲參考相同的分組項目,如果前綴爲payor,則將查找的數據分開,並將其中的數據與數據分組,其餘數據用於相關數據。

var data = { rate_cards: [{ doctor_id: "xxxxxx", doctor_name: "Dr. Dre", practice_id: "xxxxx", is_owner: 0, policy_id: 1, policy_name: "GOLD Super Gold", payor_id: 1, payor_name: "AMEX", payor_registration_number: "AMEX123", payor_contact_email: "[email protected]", payor_support_number: "PHONE", payor_logo_url: "url", doctors_policies_ratecards_id: 1, ratecard_activation_status: "Pending", ratecard_id: 1, ratecard_validity: "2017-04-17T13:16:58.000Z", ratecard_details: "{'Root Canal': 300, 'Consultation': 500}", onboarded_status: "Available" }, { doctor_id: "xxxxxx", doctor_name: "<NAME>", practice_id: "xxxxxx", is_owner: 0, policy_id: 2, policy_name: "GOLD Super Gold", payor_id: 1, payor_name: "AMEX", payor_registration_number: "AMEX", payor_contact_email: "[email protected]", payor_support_number: "<PHONE>", payor_logo_url: "url", doctors_policies_ratecards_id: 2, ratecard_activation_status: "Pending", ratecard_id: 1, ratecard_validity: "2017-04-17T13:16:58.000Z", ratecard_details: "{'Root Canal': 300, 'Consultation': 500}", onboarded_status: "Available" }] }, 
 
    result = { payors: [] }; 
 

 
data.rate_cards.forEach(function (hash) { 
 
    return function (o) { 
 
     var temp = { payor: {}, data: {} }; 
 
     Object.keys(o).forEach(function (k) { 
 
      temp[k.match(/^payor/) || 'data'][k] = o[k]; 
 
     }); 
 
     if (!hash[o.payor_name]) { 
 
      temp.payor.data = []; 
 
      hash[o.payor_name] = temp.payor; 
 
      result.payors.push(hash[o.payor_name]); 
 
     } 
 
     hash[o.payor_name].data.push(temp.data); 
 
    }; 
 
}(Object.create(null))); 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

我遍歷rate_cards加入付款人我的字典由ID索引。對於每個支付者,我將剩餘的對象添加到數據數組中。

之後,我把我的字典轉換成數組並打印結果。

const input = { 
 
    "rate_cards": [{ 
 
     "doctor_id": "xxxxxx", 
 
     "doctor_name": "Dr. Dre", 
 
     "practice_id": "xxxxx", 
 
     "is_owner": 0, 
 
     "policy_id": 1, 
 
     "policy_name": "GOLD Super Gold", 
 
     "payor_id": 1, 
 
     "payor_name": "Amex", 
 
     "payor_registration_number": "AMEX123", 
 
     "payor_contact_email": "[email protected]", 
 
     "payor_support_number": "PHONE", 
 
     "payor_logo_url": "url", 
 
     "doctors_policies_ratecards_id": 1, 
 
     "ratecard_activation_status": "Pending", 
 
     "ratecard_id": 1, 
 
     "ratecard_validity": "2017-04-17T13:16:58.000Z", 
 
     "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
 
     "onboarded_status": "Available" 
 
    }, 
 
    { 
 
     "doctor_id": "xxxxxx", 
 
     "doctor_name": "<NAME>", 
 
     "practice_id": "xxxxxx", 
 
     "is_owner": 0, 
 
     "policy_id": 2, 
 
     "policy_name": "GOLD Super Gold", 
 
     "payor_id": 1, 
 
     "payor_name": "AMEX", 
 
     "payor_registration_number": "AMEX", 
 
     "payor_contact_email": "[email protected]", 
 
     "payor_support_number": "<PHONE>", 
 
     "payor_logo_url": "url", 
 
     "doctors_policies_ratecards_id": 2, 
 
     "ratecard_activation_status": "Pending", 
 
     "ratecard_id": 1, 
 
     "ratecard_validity": "2017-04-17T13:16:58.000Z", 
 
     "ratecard_details": "{'Root Canal': 300, 'Consultation': 500}", 
 
     "onboarded_status": "Available" 
 
    } 
 
    ] 
 
}; 
 

 
const payors = new Map(); 
 

 
function isPayorProperty(value, key) { 
 
    return key.indexOf('payor') === 0; 
 
} 
 

 
for (const card of input.rate_cards) { 
 
    if (!payors.has(card.payor_id)) { 
 
    payors.set(card.payor_id, _.assign({ 
 
     data: [] 
 
    }, _.pickBy(card, isPayorProperty))); 
 
    } 
 

 
    const payor = payors.get(card.payor_id); 
 
    payor.data.push(_.pickBy(card, _.negate(isPayorProperty))); 
 
} 
 

 
const output = { 
 
    "rate_cards": [] 
 
}; 
 

 
for (const payor of payors) { 
 
    output.rate_cards.push(payor[1]); 
 
} 
 

 
console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>