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

Why is my d3 map function returning an undefined source attribute?

本文关键字:一个 未定义 属性 d3 我的 映射函数 返回 为什么      更新时间:2023-09-26

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

这是我的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属性,但是在映射值时,我得到一个错误:

Uncaught TypeError: Cannot read property 'weight' of undefined

我也不知道返回一个包含一堆对象的数组是否正确,这就是我在控制台上得到的。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();
...
});

我做错了什么,为什么我得到这个错误?

感谢你的帮助。

源属性和目标属性的值应该指定为索引到nodes数组;这些将被引用所取代调用后强制启动。

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

例如

:

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

Force layout期望链接数组如下所示。

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 });
 }