首页 > 解决方案 > 有人可以帮我理解这段代码吗?

问题描述

这是完整的项目

我不明白图 [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);

标签: javascriptarraysobject

解决方案


您有一个道路列表,定义为 list os 字符串对,由“-”连接,就像"Alice's House-Bob's House"连接 Alice 和 Bob 房子的道路。

然后,每条道路由 2 条边组合而成:Alice House 和 Bob house(您将道路与边分开split('_'))。

现在您创建了一张道路地图,这里将其命名为graph. 对于每条道路,您添加 2 条边,从点 A-> B 和 B-> A。

addEdge(from, to);
addEdge(to, from);

因为您可以使用同一条道路双向行驶。

每个 addEdge 调用都会检查图中是否from已经注册了一条边。但在我看来,它应该是这样的:

 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']
}

推荐阅读