使用d3.nest包含包含数组的数据

时间:2016-09-20 11:10:41

标签: javascript d3.js

我正在使用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"}]}
]

显然,我可以轻松地将这些分组,例如年龄或姓名。

当我想要显示药物(按名称)时会出现问题,因为任何患者都可以有一个,没有或几个。因此,每个患者可以没有或几个组。到目前为止,我看到了三种方法:

  1. 使用多种药物复制患者,每份患者使用不同的单一药物
  2. 这会造成冗余,我也希望从相同的数据中抽取一大堆图表。嵌套的关键(将值返回给每个患者的分组的函数)将从用户界面动态创建 - 因为它是一个吸气剂,而不是一个设定者,我需要弄清楚如何为每个副本重置药物也是。根据原始数据的复杂程度,复制可能也不是一件容易的事。

    1. 在关键功能中连接药物名称(使用唯一的分隔符),并在绘制时根据需要进行拆分和添加。
    2. 每种药物的组合都有自己的组,我需要计算含有特定药物的所有组的总和,以得出它的总频率。这似乎是一个坏主意。

      1. 编写我自己的处理数组的嵌套函数。
      2. 除非我从头开始实现,否则我将失去d3的汇总和排序功能。

        有更好的方法吗?

1 个答案:

答案 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并做你想做的事。