Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS/d3.JS:为源/目标链接创建组_Javascript_D3.js - Fatal编程技术网

Javascript JS/d3.JS:为源/目标链接创建组

Javascript JS/d3.JS:为源/目标链接创建组,javascript,d3.js,Javascript,D3.js,我一直在尝试根据它们的链接给一些节点上色,但我不知道怎么做。这是我当前的图表: 我一直在尝试自动为同一集群内的所有节点着色(即通过作为集群内任何节点的源或目标相互连接),但到目前为止,我所有的尝试都是徒劳的 我听说我可能需要做一个递归函数,但我的递归是自学的,从根本上说是错误的。这是我目前的代码: function assignGroup() { var groupedNodes = []; for(var i = 0; i < gNodes.length; i++) { if

我一直在尝试根据它们的链接给一些节点上色,但我不知道怎么做。这是我当前的图表:

我一直在尝试自动为同一集群内的所有节点着色(即通过作为集群内任何节点的源或目标相互连接),但到目前为止,我所有的尝试都是徒劳的

我听说我可能需要做一个递归函数,但我的递归是自学的,从根本上说是错误的。这是我目前的代码:

function assignGroup() {
var groupedNodes = [];

for(var i = 0; i < gNodes.length; i++) {
    if(nodes[i].group !== undefined) {
        nodes[i].group = undefined;
    }
}

for(var i = 0; i < nodes.length; i++) {
    if(nodes[i].group === undefined) {
        nodes[i].group = i;
        recursive(nodes[i],i);
    }
}


function recursive(rNode, rGrp) {       
    var tempSrc = hasSrc(rNode);        
    var tempTarg = hasTarg(rNode);

    if(tempSrc == null && tempTarg == null)
        return;

    if(tempSrc != null && tempSrc.group === undefined) {
        tempSrc.group = rGrp;
        recursive(tempSrc, rGrp);
    }

    if(tempTarg != null && tempTarg.group === undefined) {
        tempTarg.group = rGrp;
        recursive(tempTarg, rGrp);
    }
}

function hasTarg(eNode) {
    for(var i = 0; i < edges.length; i++) {
        if(nodes.name == edges[i].source)
            return getNode(nodes, edges[i].target);
        else
            return null;
    }
}

function hasSrc(eNode) {
    for(var i = 0; i < edges.length; i++) {
        if (nodes.name == edges[i].target)
            return getNode(edges[i].source);
        else
            return null;
    }
}

function getNode(id) {
    console.log(id);
    for(var i = 0; i < nodes.length; i++) {
        if(id == nodes[i].name) {
            return nodes[i];
        }
    }
    return null;
}
以下是节点数据集的预期结果:

"nodes":
[
 {
   "name": "Ben",
   "group": 1
},
 {
   "name": "May",
   "group": 1
},
 {
   "name": "Jack",
   "group": 2 /*Arbitrary group (Ungrouped)*/
},
 {
   "name": "Francis",
   "group": 3 /*Arbitrary group (Ungrouped)*/
},
 {
   "name": "Owen",
   "group": 1
},
 {
   "name": "Blake",
   "group": 1
},
 {
   "name": "Julia",
   "group": 1
},
 {
   "name": "Liam",
   "group": 4 /*Arbitrary group (Ungrouped)*/
}
]

编辑:这是JSFIDLE:

这是我的解决方案。首先,我们给每个节点一个不同的编号:

data.nodes.forEach(function(d, i) {
    d.group = i
});
你知道,数字本身并不重要

然后,我们检查每个节点的名称是否位于
数组中每个对象的
目标
。如果是,我们将其编号提供给
节点
数组中的源和目标对应方:

data.nodes.forEach(function(d) {
    data.edges.forEach(function(e) {
        if (e.source === d.name || e.target === d.name) {
            data.nodes.find(function(f) {
                return f.name === e.source
            }).group = d.group;
            data.nodes.find(function(f) {
                return f.name === e.target
            }).group = d.group;
        }
    })
})
这就像一个传染过程:在
目标
上找到其名称的第一个节点传播其编号。再说一次,数字本身并不重要

下面是一个演示:

var数据={
“节点”:[{
“姓名”:“本”,
}, {
“姓名”:“可能”,
}, {
“姓名”:“杰克”,
}, {
“姓名”:“弗朗西斯”,
}, {
“姓名”:“欧文”,
}, {
“姓名”:“布莱克”,
}, {
“姓名”:“朱莉娅”,
}, {
“姓名”:“利亚姆”,
}],
“边缘”:[{
“来源”:“本”,
“目标”:“可能”
}, {
“来源”:“本”,
“目标”:“布莱克”
}, {
“来源”:“本”,
“目标”:“欧文”
}, {
“来源”:“欧文”,
“目标”:“朱莉娅”
}]
};
data.nodes.forEach(函数(d,i){
d、 组=i
});
data.nodes.forEach(函数(d){
data.edges.forEach(函数(e){
if(e.source==d.name | | e.target==d.name){
data.nodes.find(函数(f){
返回f.name==e.source
}).组=d组;
data.nodes.find(函数(f){
返回f.name==e.target
}).组=d组;
}
})
})

console.log(数据)
Wow!再次非常感谢你!:)很好用!太糟糕了,最多投票数是1。。非常感谢你的帮助!只需对您的答案进行一个小的编辑,当我运行包含更多节点条目的数据时,我意识到获取的组号来自最近的组号(即获取更高的组号),并且由于组号是非递归的,因此仅更改阵列底部(后面)的源/目标对的组号。因此,我将组号设置为:(getGroup(e.source)Beatrice,这是组9,意味着第一个重复的组是9。编辑:看来我们同时发布了评论!很高兴知道问题“自行解决”。。。
data.nodes.forEach(function(d) {
    data.edges.forEach(function(e) {
        if (e.source === d.name || e.target === d.name) {
            data.nodes.find(function(f) {
                return f.name === e.source
            }).group = d.group;
            data.nodes.find(function(f) {
                return f.name === e.target
            }).group = d.group;
        }
    })
})