使用JavaScript / d3.js有效地将表格数据(对象数组)转换为方形矩阵

时间:2013-10-16 17:54:33

标签: javascript matrix d3.js chord-diagram

我遇到了与将数据从一种形式转换为另一种形式相关的编程问题。

我有一个对象数组,表示需要转换为可视化矩阵的数据表。我在教育期间以某种方式避免了覆盖矩阵数学,所以如果我的术语不正确,请道歉。


更具体地说,我有一个表示格式化数据的对象数组:

var pokes = [
    {source: "Harry", target: "Maria", type: "poke"},
    {source: "Brin", target: "Serge", type: "poke"},
    {source: "Maria", target: "Brin", type: "poke"},
    {source: "Serge", target: "Simon", type: "poke"},
    {source: "Brin", target: "Serge", type: "poke"}
];

我需要把它变成一个方形矩阵,用于和弦图,例如:

var matrix = [
    [0, 5, 2, 1, 4],
    [7, 0, 8, 4, 7],
    [9, 4, 0, 3, 1],
    [8, 5, 5, 0, 8],
    [6, 3, 9, 2, 0]
];

结果矩阵的长度/宽度n等于数组中唯一个体的数量(Harry,Serge等),相应单元格中的值(x,y)是person x的次数戳人y。 pokes数组中的每个对象代表一个poke(“type”属性不影响矩阵的构造)。


所以,例如,对象:

{source: "Brin", target: "Serge", type: "poke"}

会向代表的单元格添加1(Brin,Serge)。


这是我的伪代码方法:

Create array, people, containing list of unique people in pokes (both source and target).
Create empty array, matrix.
For each person in people:
    Create an array, foo, of size people.length.
    For each poke in pokes:  
        If person == poke.source:
            Add 1 to foo[x] where x is the index of poke.target in people.
    Push foo into matrix.

我还没有进入真正的代码,因为我不确定这个方法是:

  1. 正确
  2. 高效/快速,特别是如果pokes.length接近数千
  3. 任何建议都将受到赞赏;特别是如果d3.js有一个隐藏的方法来创建我没有发现的矩阵。

0 个答案:

没有答案