首页 > 解决方案 > Eloquent JavaScript - 在机器人项目开始时遇到问题

问题描述

在第 7 章机器人项目中,在 Eloquent JavaScript 中,我很难弄清楚机器人项目的开始部分。

const roads = [
   "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];
      console.log()
    } 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);
console.log(roadGraph)

这是我不明白的。由于从,到周围的括号,这里的这条线引起了我的问题

for (let [from, to] of edges.map(r => r.split("-")))

当我在 eloquent javascript 沙箱中运行它时,它可以工作,但是当我尝试在 cloud9 IDE 或 Visual Studio Code 中运行它时,它给了我一个数组说

SyntaxError: Unexpected token [

为什么我在 cloud9 IDE 或 VS Code 中收到意外的令牌错误?

另外,我不确定我知道发生了什么,所以我会写下我认为我从这个项目的早期部分理解的内容;如果可能的话,我希望有人能给我一些关于这个项目如何运作的说明。

function buildGraph(edges){
}

函数 buildGraph 接受一个目的地数组,使每个目的地成为我们将创建的对象的一个​​属性,每个属性都将包含一个可以从该目的地属性访问的目的地数组。

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

}

这将创建一个具有空原型的对象,称为图。

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

  //Here's Where The Confusion Starts
  function addEdge(from, to) {
    if (graph[from] == null) {
      graph[from] = [to];
    } else {
      graph[from].push(to);
    }
  }

创建一个名为 addEdge 的函数,它接受两个参数,我相信这将是目的地。但是这里的这部分,杀了我,老实说,我不明白这里发生了什么。

   if (graph[from] == null) {
      graph[from] = [to];
    } else {
      graph[from].push(to);
    }
  }

有人可以帮忙吗?这是我关于堆栈溢出的第一个问题,所以如果我的问题没有被问到 100% 正确,我深表歉意。但是任何帮助都会很棒。

标签: javascript

解决方案


for (let [from, to] of edges.map(r => r.split("-")))

上面的解构在较旧的 Node.js 中不可用。可能是您的 IDE 使用的是旧的(我无权访问这些 IDE,所以这只是猜测)。我检查了 5.6.0 和 10.9.0:前者不支持,后者支持。

但是,我必须承认我对为什么有点困惑,因为显然规范禁止let那里(尽管它非常满意const)。

if (graph[from] == null) {
    graph[from] = [to];
  } else {
    graph[from].push(to);
  }
}

graph是节点和连接目的地列表之间的映射。在开始时,假设它以空白对象开始,graph[from]将是undefined; 但是 JavaScript 或多或少地忽略了使用时nullundefined使用时的区别==(与其更严格的兄弟相反===)。因此,当图中的起点还没有任何目的地时,我们只需将其设置为包含目的地的单元素列表。

另一方面,如果我们已经在那里设置了一些东西,那么graph[from]将已经包含一个我们不想覆盖的列表,所以我们只需使用.push.

例如,前三个迭代将从Alice's House. 第一个toBob's Housegraph["Alice's House"]也是如此undefined,我们把它放在["Bob's House"]那里。在下一次迭代中,它是 fromAlice's HouseCabin; 但是 nowgraph["Alice's House"]不是空的,所以我们追加到它上面,结果是["Bob's House", "Cabin"]. 在运行结束时,我们会知道如果我们在 Alice's House,我们可以去三个可能的地方(Bob's House、Cabin 和 Post Office)。


推荐阅读