Graph D3:当我修改代码以通过定义的键而不是索引链接节点时,链接在force布局图中不可见

Graph D3:当我修改代码以通过定义的键而不是索引链接节点时,链接在force布局图中不可见,graph,d3.js,force-layout,Graph,D3.js,Force Layout,我在用mbostock的 我修改了数据格式,通过定义的键(名称和类型)而不是索引链接节点。我尝试过修改tick函数并选择和追加,但似乎没有任何效果 这是我的密码 .节点圆{ /*冲程:#fff*/ 光标:指针; 行程:#3182bd; 笔划宽度:1.5px; } .节点文本{ 字体:10px无衬线; 指针事件:无; 文本锚定:中间; } .链接{ 笔画不透明度:.6; 笔划宽度:1.5px; 行程:#666; 填充:无; } .link.deliver{ 笔画:绿色; } .link.sent

我在用mbostock的

我修改了数据格式,通过定义的键(名称和类型)而不是索引链接节点。我尝试过修改tick函数并选择和追加,但似乎没有任何效果

这是我的密码


.节点圆{
/*冲程:#fff*/
光标:指针;
行程:#3182bd;
笔划宽度:1.5px;
}
.节点文本{
字体:10px无衬线;
指针事件:无;
文本锚定:中间;
}
.链接{
笔画不透明度:.6;
笔划宽度:1.5px;
行程:#666;
填充:无;
}
.link.deliver{
笔画:绿色;
}
.link.sentTo{
笔划数组:0,2 1;
}
/*基于类型的节点颜色*/
circle.emailAddress{
填充:蓝色;
}
circle.ip{
填充物:红色;
}
圆圈,不见了{
填写:“3182bd”;
}
可变宽度=960,
高度=500;
var color=d3.scale.category20();
var linkDistanceScale=d3.scale.linear()
.domain([105000])
.范围([2300])
.夹具(正确);
var-force=d3.layout.force()
.linkDistance(30)
。收费(-120)
.尺寸([宽度、高度]);
var svg=d3.选择(“主体”)
.append(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度);
变量图={
“节点”:[
{
“名称”:foo@pp.com",
“类型”:“电子邮件地址”,
“尺寸”:1234
},
{
“名称”:“192.168.0.1”,
“类型”:“ip”,
“尺寸”:870
},
{
“名称”:bar@pp.com",
“类型”:“电子邮件地址”,
“尺寸”:3423
}
],
“无向邻居”:[
{
“标签”:“交付人”,
“左”:{
“名称”:foo@pp.com",
“类型”:“电子邮件地址”
},
“对”:{
“名称”:“192.168.0.1”,
“类型”:“ip”
},
“重量”:366
},
{
“左”:{
“类型”:“电子邮件地址”,
“名称”:foo@pp.com"
},
“对”:{
“类型”:“电子邮件地址”,
“名称”:bar@pp.com"
},
“标签”:“sentTo”,
“重量”:777
}
]
};
var my_nodes=graph.nodes.slice(),
my_Neights=graph.undirectedNeights.slice();
log(“我的邻居”,我的邻居);
var hash_lookup=[];
//这样我们就可以在O(1)中按条目(名称:x,类型,y)查找节点:
my_nodes.forEach(函数(节点)){
var key={name:node.name,type:node.type};
hash_lookup[key]=节点;
});
//告诉d3在哪里可以找到节点信息
我的邻居。forEach(函数(链接){
var left=link.left;
var-right=link.right;
var leftKey={name:left.name,类型:left.type};
var rightKey={name:right.name,type:right.type};
link.source=hash_lookup[leftKey];
link.target=hash_lookup[rightKey];
});
log(“我的邻居”,我的邻居);
log(“我的_节点”,我的_节点);
log(“neighobs”,graph.undirectedneighbories);
/**************设置部队布局****************/
力
.nodes(我的节点)
.links(我的邻居)
.连接距离(功能(d){
控制台日志(“链接距离”,d);
返回链接距离刻度(d.重量);
})
.start();
log(“force.links()”,force.links());
/**************画路径****************/
var-link=svg
.append(“svg:g”)//在该容器中绘制“曲线”
.selectAll(“路径”)
.data(force.links())
.输入()
.append(“svg:path”)
//.attr(“类”、“链接”)
.attr(“类”,函数(d){
返回“链接”+d.type;
});
/**************画圈****************/
var node=svg
.selectAll(“.node”)
.data(force.nodes());
变量圆=节点
.输入()
.附加(“圆圈”)
.attr(“类”、“节点”)
.attr(“r”,函数(d){
控制台日志(“圆圈d”,d);
返回数学sqrt(d.size)/10 | | 4.5;
})
.attr(“类”,函数(d){
返回d.type | |“missing”//基于上面定义的圆圈*的颜色圆圈
})
.呼叫(强制拖动);
/**************曲线器悬停在圆上时显示名称****************/
var text=circle.append(“标题”)
.text(函数(d){返回d.name;});
force.on(“勾号”,函数(){
link.attr(“d”,函数(d){
变量dx=d.target.x-d.source.x,
dy=d.target.y-d.source.y,
dr=Math.sqrt(dx*dx+dy*dy);
返回“M”+d.source.x+”、“+d.source.y+”A“+dr+”、“+dr+”0,1“+d.target.x+”、“+d.target.y”;
});
节点
.attr(“转换”,函数(d){
返回“translate”(“+d.x+”,“+d.y+”);});
});

任何洞察都将不胜感激。

撇开这种方法是否是一个好主意不谈,问题是您试图将对象用作对象中的键(您的哈希查找)。这在JavaScript中不起作用。一个快速、肮脏的黑客修复方法就是在使用地图键之前将其转换为字符串

var hash_lookup = {};

// make it so we can lookup nodes by entry (name: x, type, y) in O(1):
my_nodes.forEach( function(node) {
  var key = JSON.stringify({name: node.name, type: node.type});
  hash_lookup[key] = node;
});

// tell d3 where to find nodes info
my_neighbors.forEach( function(link) {

  var left = link.left;
  var right = link.right; 

  var leftKey = JSON.stringify({name: left.name, type: left.type});
  var rightKey = JSON.stringify({name: right.name, type: right.type});

  link.source = hash_lookup[leftKey];
  link.target = hash_lookup[rightKey];
});
var hash_lookup = {};

// make it so we can lookup nodes by entry (name: x, type, y) in O(1):
my_nodes.forEach( function(node) {
  var key = JSON.stringify({name: node.name, type: node.type});
  hash_lookup[key] = node;
});

// tell d3 where to find nodes info
my_neighbors.forEach( function(link) {

  var left = link.left;
  var right = link.right; 

  var leftKey = JSON.stringify({name: left.name, type: left.type});
  var rightKey = JSON.stringify({name: right.name, type: right.type});

  link.source = hash_lookup[leftKey];
  link.target = hash_lookup[rightKey];
});