Javascript 解释Mike Bostock节点解析循环
我对JavaScript和d3比较陌生,但我对强制式布局非常感兴趣。在Mike Bostock的力导向可视化中,他倾向于使用以下代码(或类似代码)解析链接列表中的节点: 我完全理解他在这里最终完成的工作,我只是想更好地理解Javascript 解释Mike Bostock节点解析循环,javascript,d3.js,network-analysis,d3-force-directed,Javascript,D3.js,Network Analysis,D3 Force Directed,我对JavaScript和d3比较陌生,但我对强制式布局非常感兴趣。在Mike Bostock的力导向可视化中,他倾向于使用以下代码(或类似代码)解析链接列表中的节点: 我完全理解他在这里最终完成的工作,我只是想更好地理解forEach循环中的JavaScript语法(实际上,是完全理解的)。如果有人能解释,我会非常感激 这显然是非常优雅的代码,但我在互联网上找不到任何解释——我可能在搜索中遗漏了一个关键术语,所以我不情愿地在这里问这个问题。真正让我感到不快的是: | |两侧的两个作业的作用
forEach
循环中的JavaScript语法(实际上,是完全理解的)。如果有人能解释,我会非常感激
这显然是非常优雅的代码,但我在互联网上找不到任何解释——我可能在搜索中遗漏了一个关键术语,所以我不情愿地在这里问这个问题。真正让我感到不快的是:
两侧的两个作业的作用| |
- 每行第一次赋值的顺序(每行的左侧):例如,为什么是
而不是link.source=节点[link.source]
节点[link.source]=link.source
- 在下面的代码中
link.source=节点[link.source]| |(节点[link.source]={name:link.source})代码>
这意味着
link.source=节点[link.source]
如果节点[link.source]
未定义
如果节点[link.source]
未定义,则将执行下面的块
(节点[link.source]={name:link.source})//为节点[link.source]分配新值
上述值将设置为link.source
因此,如果你把它简单化,它会像:
link.source=节点[link.source]| |(节点[link.source]={name:link.source})代码>
相当于:
if (!nodes[link.source]) {//not undefined
link.source = nodes[link.source];
} else {
nodes[link.source] = {name: link.source}
link.source = nodes[link.source];
}
希望这有帮助
解释您的评论
问题(a=b | | c等于a=b,但如果b未定义,则表示a=c,对吗?
是
问题仍然没有意义的是,为什么这些赋值的左侧是link.source和link.target?这些已经定义好了,我们要用它们填充节点
对!!您在这里是正确的这些已经定义了。
link.source当前为=“A”
块执行后,每个link.source都将指向一个对象,类似这样link.source={name:A}
如果您仍然感到困惑,请告诉我。好的,这有助于理解语法(a=b | | c等于a=b,但如果b未定义,则将a=c,对吗?)。仍然没有意义的是,为什么这些赋值的左侧是link.source和link.target?这些已经定义,它们是我们想要填充节点的内容。当节点缺少特定的源或目标时,这只是一种让| |的RHS执行的聪明方法吗?为您的评论添加了解释
if (!nodes[link.source]) {//not undefined
link.source = nodes[link.source];
} else {
nodes[link.source] = {name: link.source}
link.source = nodes[link.source];
}