为什么我的d3 map函数返回一个未定义的源属性?

时间:2015-10-15 02:31:36

标签: javascript csv dictionary d3.js

我是d3js的新手,我在尝试将csv文件映射到强制布局的链接时遇到了一些问题。

这是我的csv文件:

node,edges,centrality_degree
1,"[(1, 2), (1, 3), (1, 4), (1, 5)]",1.0
2,"[(2, 1), (2, 3), (2, 4), (2, 5)]",1.0
3,"[(3, 1), (3, 2), (3, 4), (3, 5)]",1.0
4,"[(4, 1), (4, 2), (4, 3), (4, 5)]",1.0
5,"[(5, 1), (5, 2), (5, 3), (5, 4)]",1.0

我想将边缘值设置为d3.layout.force()的links属性,但是在映射值时,我收到错误:

  

未捕获的TypeError:无法读取未定义的属性'weight'

我不知道返回带有一堆对象的数组是否正确,这就是我在控制台上获得的内容。 5个数组,每个数组包含4个对象,每个对象都有源和目标属性。除5数组外,属性都是正确的。我得到了它的第一个源值的未定义值。它应该是5。

这是我的代码:

var force = d3.layout.force()
    .size([w, h]);

d3.csv("{{ g }}", function(d) {

    var nodes = d3.values(d.map( function(d){ return +d.node; } ));

    var links_list = d.map( function(d) {

        list_array = JSON.parse(d.edges.replace(/\(/g,"[").replace(/\)/g,"]"));

        var i, len = list_array.length;

        links = [];

        for (i=0; i<len; i++) {
            links.push({source: list_array[i][0] ,target: list_array[i][1] });
        }

        console.log(links);

        #console result:
        #[Object, Object, Object, Object]
        #[Object, Object, Object, Object]
        #[Object, Object, Object, Object]
        #[Object, Object, Object, Object]
        #expanding one array:
            #0: Object
            #1: Object
            #2: Object
            #3: Object
        #[Object, Object, Object, Object]
            #expanding the array[5][0] object: 
            #0: Object
                #source: undefined
                #target: 2
                #__proto__: Object

    });

    force
        .nodes(nodes)
        .links(links)
        .start();

...

});

我做错了什么以及为什么我收到这个错误?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  

源和目标属性的值应指定为   索引到nodes数组;这些将被引用所取代   在强制召唤之后。

请注意,数组索引从0开始而不是从1开始。但是在csv的数据中,您有(5, 1), (5, 2), (5, 3), (5, 4)之类的链接,而您的nodes数组只有5个元素;最后一个元素的索引是4.您应该将这些数字减少为1以表示实际节点。

例如:

var nodes = [{ name: "A", id: 1},{ name: "B", id: 2}];

强制布局需要链接数组,如下所示。

var links = [{ source:0, target: 1 }];

希望你遇到问题。您必须按照以下所示方式获取实际指数。

 for (i=0; i<len; i++) {
    links.push({source: list_array[i][0]-1 ,target: list_array[i][1]-1 });
 }