首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaScript中构造具有唯一值的对象

在JavaScript中构造具有唯一值的对象
EN

Stack Overflow用户
提问于 2018-10-18 02:50:17
回答 2查看 43关注 0票数 2

我正在查看代码,查看

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的唯一值构建一个名为"nodes“的对象列表),但是我不理解它的构造。请解释上面的语句是如何工作的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-18 04:10:43

要理解此link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});

你必须注意到这句话的花边。在第一次迭代中,作为(nodes[link.source] = {name: link.source});的结果,系统将输出{name: 'Microsoft'},并且此输出将被指定为links[0].source的值

结论,它不仅像您所说的那样构造节点对象。它还改变了links对象中项目的结构,变成:

var links = [
    {source: { name: "Microsoft"},

target也是如此

让我知道它是否仍然难以掌握

票数 1
EN

Stack Overflow用户

发布于 2018-10-18 03:19:42

我只接受回调的第一行。第二行与第一行相同。

首先,这是一个任务。

link.source =

下面的表达式有两个部分,

              nodes[link.source] || (nodes[link.source] = {name: link.source})
              ^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

其中评估第一部分,如果结果是错误的,则评估第二部分。

这种方法的优点是可以用来防止对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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52861714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档