我正在完成本教程 -
http://flowingdata.com/2012/08/02/how-to-make-an-interactive-network-visualization/
有一部分我不明白。
“最后,我们将节点 id 映射到节点对象,然后将链接中的源和目标替换为节点对象本身,而不是原始数据中的 id。这使得 D3 的强制布局能够正常工作,并使其成为可能添加/删除节点,而不用担心我们的节点数组和链接数组乱序。”
setupData = (data) ->
# initialize circle radius scale
countExtent = d3.extent(data.nodes, (d) -> d.playcount)
circleRadius = d3.scale.sqrt().range([3, 12]).domain(countExtent)
data.nodes.forEach (n) ->
# set initial x/y to values within the width/height
# of the visualization
n.x = randomnumber=Math.floor(Math.random()*width)
n.y = randomnumber=Math.floor(Math.random()*height)
# add radius to the node so we can use it later
n.radius = circleRadius(n.playcount)
# id's -> node objects
nodesMap = mapNodes(data.nodes)
# switch links to point to node objects instead of id's
data.links.forEach (l) ->
l.source = nodesMap.get(l.source)
l.target = nodesMap.get(l.target)
# linkedByIndex is used for link sorting
linkedByIndex["#{l.source.id},#{l.target.id}"] = 1
data
这是在关于函数 setupData() 的部分之后说的。我不明白将节点 ID 映射到节点对象意味着什么,因为似乎节点对象是随后由 update() 方法创建的。
这些节点对象是什么?mapNodes() 将如何