Javascript 有人能帮我理解这个代码吗?

Javascript 有人能帮我理解这个代码吗?,javascript,arrays,object,Javascript,Arrays,Object,我不明白图[from]是如何工作的,它是否像在“from”位置的数组中那样检查值?或者“from”是对象的属性名吗?我在终端中尝试了这两种方法,当它是一个数字时,使用from作为属性名是有效的。将其用作数组索引会给我一个“from未定义”的错误。 还有图形[from].push(to)。它是如何工作的 function buildGraph(edges) { let graph = Object.create(null); function addEdge(from, to) {

我不明白图[from]是如何工作的,它是否像在“from”位置的数组中那样检查值?或者“from”是对象的属性名吗?我在终端中尝试了这两种方法,当它是一个数字时,使用from作为属性名是有效的。将其用作数组索引会给我一个“from未定义”的错误。 还有图形[from].push(to)。它是如何工作的

function buildGraph(edges) {
  let graph = Object.create(null);

  function addEdge(from, to) {
    if (graph[from] == null) {
      graph[from] = [to];
    } else {
      graph[from].push(to);
    }
  }
  for (let[from, to] of edges.map(r = > r.split("-"))) {
    addEdge(from, to);
    addEdge(to, from);
  }
  return graph;
}
const roadGraph = buildGraph(roads);

您有一个道路列表,定义为列表os字符串对,由“-”连接,如
“Alice’s House Bob’s House”
是连接Alice和Bob House的道路

然后,每条道路由两条边组合而成:Alice House和Bob House(您可以使用
拆分(“')
)将道路拆分为两条边)

现在您创建了一张道路地图,在这里它被称为
graph
。从A->B点和B->A点开始,为每条道路添加两条边

addEdge(from, to);
addEdge(to, from);
因为你们可以用同一条路双向行驶

每个addEdge调用都会检查图中是否已经注册了来自的边。 但我认为应该是这样的:

 function addEdge(from, to) {
    if (!graph[from]) { // if object 'from' is not yet register, add an empty array to from key
      graph[from] = [];
    }
    graph[from].push(to); // add edge 'to, to mapping of 'from'
  }
graph = {
   'Alice house': ['Bob house', 'Post office'],
   'Post office': ['Alice house'],
   'Bob house': ['Alice house']
}
因此,最终您将构建一个地图,它将如下所示:

 function addEdge(from, to) {
    if (!graph[from]) { // if object 'from' is not yet register, add an empty array to from key
      graph[from] = [];
    }
    graph[from].push(to); // add edge 'to, to mapping of 'from'
  }
graph = {
   'Alice house': ['Bob house', 'Post office'],
   'Post office': ['Alice house'],
   'Bob house': ['Alice house']
}

点击您喜爱的浏览器的开发工具。在其中键入以下内容:

let roadsX = [
  "Alice's House-Bob's House",   "Alice's House-Cabin",
  "Alice's House-Post Office",   "Bob's House-Town Hall",
  "Daria's House-Ernie's House", "Daria's House-Town Hall",
  "Ernie's House-Grete's House", "Grete's House-Farm",
  "Grete's House-Shop",          "Marketplace-Farm",
  "Marketplace-Post Office",     "Marketplace-Shop",
  "Marketplace-Town Hall",       "Shop-Town Hall"
];

function buildGraph(edges) {
  let graph = Object.create(null);
  function addEdge(from, to) {
    if (graph[from] == null) {
      graph[from] = [to];
    } else {
      graph[from].push(to);
    }
  }
  for (let [from, to] of edges.map(r => r.split("-"))) {
    addEdge(from, to);
    addEdge(to, from);
  }
  return graph;
}

let roadGraphX = buildGraph(roads);

console.log(roadGraphX);

您将看到函数的作用。

addEdge
是一个函数。函数具有在调用时传递的参数
addEdge
声明为
function addEdge(from,to)
,这意味着在代码中调用函数时,传递到函数中的第一个参数都是
from
。例如,如果要从中写入
addEdge(1,2)
-
,函数内的
addEdge
是一个变量。因此,当你在
addEdge
函数中说
graph[from]
时,你可以把它解释为
graph[1]
我猜如果你通过
[“蓝-红”,“绿-蓝”]
作为
道路
你会得到一个像
{blue:[“红”,“绿”],[“蓝”],[蓝]]这样的对象
@karthick我知道addEdge做什么。我只是被graph[from]的语法弄糊涂了。我们将图形创建为空对象。“graph[from]”中的“from”表示什么?
graph[from]
是对象属性检索的括号符号。正如@HereticMonkey所说,如果graph是一个对象,您可以通过说
graph[“mykey”]=“myvalue”
在graph中设置键值对-这类似于说
graph.mykey=“myvalue”
除了使用fomer,您可以使用空格之类的东西,因为您的键是字符串。通过指向
graph[“mykey”]
来访问值-还值得注意的是,在代码中
[to]
只是一个数组,其中包含
to
。您还可以执行
graph[from]=[…graph[from]| |[]to]如果你想:)。非常好的内联-我需要记住:)非常感谢你的帮助。您还可以解释一下“graph[from].push(to)”是如何工作的吗?我知道push将元素放在数组的末尾,但graph不是数组,它在这里是如何工作的?@MazharAli graph不是数组,来自
内部
graph
的键指向数组。例如,
graph[“Alice house”].push(“Post office”)
将值“Post office”推送到位于
graph[“Alice house”]
的数组中,OP要求解释代码的功能,而不是代码的最终功能。