Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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 解释Mike Bostock节点解析循环_Javascript_D3.js_Network Analysis_D3 Force Directed - Fatal编程技术网

Javascript 解释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语法(实际上,是完全理解的)。如果有人能解释,我会非常感激 这显然是非常优雅的代码,但我在互联网上找不到任何解释——我可能在搜索中遗漏了一个关键术语,所以我不情愿地在这里问这个问题。真正让我感到不快的是: | |两侧的两个作业的作用

我对JavaScript和d3比较陌生,但我对强制式布局非常感兴趣。在Mike Bostock的力导向可视化中,他倾向于使用以下代码(或类似代码)解析链接列表中的节点:

我完全理解他在这里最终完成的工作,我只是想更好地理解
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];
      }