这个问题与我之前问过的一个问题有关:Using JSON in d3v4 stacked bar chart。
背景:对于堆积的条形图,我试图代表一系列医院,这些医院显示每位患者的诊断所属的类别总数(每家医院)。我通过使用SQL查询生成了JSON文件并将其导出。
问题:如何更改JSON数组数据结构以合并同一家医院的多个类别?
我的堆叠条形图的JSON数组数据结构(一小部分)如下所示:
[{
"hospitalName": "hospital1",
"category": "Injury & Poisoning",
"Females": "0",
"Males": "4",
"Unknown": "0",
"count": "4"
},
{
"hospitalName": "hospital1",
"category": "Symptoms, Signs, & Ill-Defined Conditions",
"Females": "1",
"Males": "1",
"Unknown": "0",
"count": "2"
},
{
"hospitalName": "hospital2",
"category": "Mental Disorders",
"Females": "0",
"Males": "1",
"Unknown": "0",
"count": "1"
}]
所需的JSON数组数据结构:
[{
"hospitalName": "hospital1",
"Injury & Poisoning": "4",
"Symptoms, Signs, & Ill-Defined Conditions": "2"
"Females": "1", <--- the count of females is increased
"Males": "5", <--- the count of males is increased
"Unknown": "0",
"count": "6"
},
{
"hospitalName": "hospital2",
"category": "Mental Disorders",
"Females": "0",
"Males": "1",
"Unknown": "0",
"count": "1"
}]
这可能是使用SQL查询生成的还是我可以使用PLSQL代替的?
答案 0 :(得分:1)
只需创建一个新字典,其关键字等于医院名称即可。 然后从字典中检索所有元素。
如果您需要将计数作为字符串转换,就在将它们添加回数据列表之前进行转换。
var newdata = {};
data.forEach(element => {
var name = element.hospitalName;
var hospital = newdata[name];
if (!hospital) {
hospital = { hospitalName: name, Females: 0, Males: 0, Unknown: 0, count: 0};
newdata[name] = hospital;
}
hospital[element.category] = +element.count;
hospital.Females += +element.Females;
hospital.Males += +element.Males;
hospital.Unknown += +element.Unknown;
hospital.count += +element.count;
});
data = [];
for (const key in newdata) {
if (newdata.hasOwnProperty(key)) {
data.push(newdata[key]);
}
}
作为一个小型运行示例,其中包含您的巨大数据集。
var data = [{
"hospitalName": "hospital1",
"category": "Injury & Poisoning",
"Females": "0",
"Males": "4",
"Unknown": "0",
"count": "4"
},
{
"hospitalName": "hospital1",
"category": "Symptoms, Signs, & Ill-Defined Conditions",
"Females": "1",
"Males": "1",
"Unknown": "0",
"count": "2"
},
{
"hospitalName": "hospital2",
"category": "Mental Disorders",
"Females": "0",
"Males": "1",
"Unknown": "0",
"count": "1"
}];
var newdata = {};
data.forEach(element => {
var name = element.hospitalName;
var hospital = newdata[name];
if (!hospital) {
hospital = { hospitalName: name, Females: 0, Males: 0, Unknown: 0, count: 0};
newdata[name] = hospital;
}
hospital[element.category] = +element.count;
hospital.Females += +element.Females;
hospital.Males += +element.Males;
hospital.Unknown += +element.Unknown;
hospital.count += +element.count;
});
data = [];
for (const key in newdata) {
if (newdata.hasOwnProperty(key)) {
data.push(newdata[key]);
}
}
console.log(data);