我正在使用d3制作一些漂亮的图表,所有相同的原始数据。但是,此原始数据包含数组。
var data = [
{name: "Alfred", age: "27", medication: [{name: "Aspirin", dose: "14", unit: "tablets"}]},
{name: "Brian", age: "62", medication: []},
{name: "Chris", age: "46", medication: [{name: "Bisoprolol", dose: "3", unit: "ml"}, {name: "Clotrimazol", dose: "2", unit: "mg"}]},
{name: "David", age: "68", medication: [{name: "Aspirin", dose: "4", unit: "tablets"}, {name: "Bisoprolol", dose: "1.5", unit: "ml"}, {name: "Clotrimazol", dose: "2", unit: "mg"}]}
]
显然,我可以轻松地将这些分组,例如年龄或姓名。
当我想要显示药物(按名称)时会出现问题,因为任何患者都可以有一个,没有或几个。因此,每个患者可以没有或几个组。到目前为止,我看到了三种方法:
这会造成冗余,我也希望从相同的数据中抽取一大堆图表。嵌套的关键(将值返回给每个患者的分组的函数)将从用户界面动态创建 - 因为它是一个吸气剂,而不是一个设定者,我需要弄清楚如何为每个副本重置药物也是。根据原始数据的复杂程度,复制可能也不是一件容易的事。
每种药物的组合都有自己的组,我需要计算含有特定药物的所有组的总和,以得出它的总频率。这似乎是一个坏主意。
除非我从头开始实现,否则我将失去d3的汇总和排序功能。
有更好的方法吗?
答案 0 :(得分:0)
我没有看到更好的方法,除了预处理您的数据(如您的pt.1),因此密钥可能是药物名称,值可能是原始数据的记录。您不需要复制患者,您可以只复制对它们的引用,这不会产生大量冗余(并节省内存)。您只需传递data
,而不是将extractMedications(data)
传递到图表功能中,这也不是真正多余的。
function extractMedications(d)
{
var res = [];
d.forEach(function(patient) {
patient.medication.forEach(function(medication) {
res.push({medication_name: medication.name, patient: patient});
})
})
return res;
}
console.log(extractMedications(data))
此解决方案的另一个优点是,您可以在data
数组中修改患者姓名,这也将反映在已转换的数组中(因为它包含对来自data
的对象的引用)
然后你需要将这个结构转发到d3.nest
并做你想做的事。