以下代码来自Mike Bostock的Force-Directed Graph with Mouseover。对不起,我不能问一个关于这段代码的更尖锐的问题,但我想知道是否有人可以解释forEach块中的语法来计算链接中的不同节点。
下面一行中究竟发生了什么以及分配给哪些变量?是否有在同一表达式中执行多个赋值的名称?
link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
var links = [
{source: "Ericsson", target: "ZTE", type: "suit"},
{source: "Kodak", target: "Samsung", type: "resolved"},
{source: "Apple", target: "Samsung", type: "suit"},
{source: "Kodak", target: "RIM", type: "suit"},
{source: "Nokia", target: "Qualcomm", type: "suit"}
];
var nodes = {};
// 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});
});
答案 0 :(得分:2)
在这一行中实际上有相当数量的解包:
link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
首先应该提到x = y || z
与此相同*:
if (y)
x = y;
else
x = z;
还应注意i = (j = k)
表示我们要将k
分配给j
,然后将该值也分配给i
。最后,i
,j
和k
都具有相同的值。
所以在这种情况下,我们真的得到了这个:
if (nodes[link.source]) {
link.source = nodes[link.source];
} else {
nodes[link.source] = { name: link.source };
link.source = nodes[link.source];
}
也就是说,如果nodes[link.source]
是真实的(不是0,null,未定义,空字符串),则link.source将被指定为nodes[link.source]
作为值。
如果它是假的,那么link.source
和nodes[link.source]
都将被指定为{name: link.source}
作为其价值。
*这些是等价的,因为当您评估||
时,如果左侧是真实的,则无需评估右侧 - 您已经可以将该语句评估为真。因此,在JavaScript中,如果y
是真实的话,它会“返回”y
,如果z
是假的y
但是z
是真的,那么false
或psutil
如果两者都是假的。