Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中构造具有唯一值的对象_Javascript_Operators - Fatal编程技术网

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

在JavaScript中构造具有唯一值的对象,javascript,operators,Javascript,Operators,我正在查看下面的代码 这个密码呢 // 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.t

我正在查看下面的代码

这个密码呢

// 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”的对象列表),但我不理解其构造。请解释上面的语句是如何工作的。

我只接受回调的第一行。第二行用作第一行

首先,这是一项任务

link.source =
使用以下包含两部分的表达式

              nodes[link.source] || (nodes[link.source] = {name: link.source})
              ^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
其中,对第一部分进行评估,如果结果是错误的,则对第二部分进行评估

这种方法的优点是防止对
节点[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];
为了理解这一点
link.source=节点[link.source]| |(节点[link.source]={name:link.source})

你必须注意到父母。 在第一次迭代中 作为
(节点[link.source]={name:link.source})的结果
系统将输出
{name:'Microsoft'}
并且此输出将被指定为
链接[0]的值。源

结论,它不仅像你说的那样构造节点对象。它还将更改链接对象内的项目结构,成为:

var links = [
    {source: { name: "Microsoft"},
对于
目标


让我知道它是否仍然难以理解

谢谢!显式检查版本确实澄清了问题。感谢您指出,这也会修改链接。因此,在迭代过程中,正在迭代的数组将在适当的位置进行更改。我听说这是一种糟糕的做法(在Python上下文中),JS可以接受吗?在JS中修改变量很常见。由于js变量在您关闭页面之前一直留在浏览器中,因此克隆传递给函数的每个变量将是一项资源需求,因为js是按引用传递的语言,您需要执行额外的步骤来克隆它。在引入
let
const
之前,这当然是正确的。但如果您使用react,您会考虑到这一点,但在vanilla js中,我不会经常遇到由变量突变引起的问题