在JavaScript中构造唯一值的对象

时间:2018-10-17 18:50:17

标签: javascript operators

我正在查看代码

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唯一值的称为“节点”的对象列表),但是我不理解该构造。请解释以上声明的工作原理。

2 个答案:

答案 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知道它是否仍然很难掌握