平JSON转换成嵌套
问题描述:
我有以下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并进行转换,但无法实现上述结构。任何帮助我能做的事情都会很棒。
答
您可以通过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
发现这是最优雅的 –
答
在普通的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; }
答
我遍历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>
'payor_name'是不同的。 –
是的。'''payor_name'''可以不同,在这种情况下,一个更多的条目将进入具有相同结构的'''payors''数组中。 –
@NinaScholz编辑了qn .. –