我正在查看代码
http://bl.ocks.org/mbostock/2706022
和此代码
// Compute the distinct nodes from the links.
links.forEach(function(link) {
link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
link.target = nodes[link.target] || (nodes[link.target] = {name: link.target});
});
对我来说看起来很奇怪。我知道代码应该做什么(应该建立具有link.source和link.target唯一值的称为“节点”的对象列表),但是我不理解该构造。请解释以上声明的工作原理。
答案 0 :(得分:1)
我只接受回调的第一行。第二行作为第一行。
首先,这是一项任务。
link.source =
带有以下两个部分的表达式
nodes[link.source] || (nodes[link.source] = {name: link.source})
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在第一部分进行评估,如果结果为假,则在第二部分进行评估。
此方法的优点是防止使用{p1}重新分配给nodes[link.source]
nodes[link.source] = nodes[link.source] || {name: link.source}
link.source = (nodes[link.source] = nodes[link.source] || {name: link.source})
现在是带有明确检查的版本
if (!nodes[link.source]) {
nodes[link.source] = {name: link.source};
}
link.source = nodes[link.source];
答案 1 :(得分:1)
要了解这一点
link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
您必须注意括号。
第一次迭代
作为(nodes[link.source] = {name: link.source});
的结果,系统将输出{name: 'Microsoft'}
并且此输出将被分配为links[0].source
结论,不仅它像您说的那样构造了节点对象。它还更改了链接对象内部项目的结构,成为:
var links = [
{source: { name: "Microsoft"},
target
相同
lemme知道它是否仍然很难掌握