javascript - Eloquent JavaScript - 机器人项目开始时遇到问题

标签 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)

这是我不明白的地方。这里的这一行引起了我的问题,因为 from、to 周围有括号

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

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

SyntaxError: Unexpected token [

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

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

function buildGraph(edges){
}

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

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

}

这将创建一个具有空原型(prototype)的对象,称为 graph。

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% 正确,我深表歉意。但任何帮助都会很棒。

最佳答案

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

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

但是,我必须承认我有点困惑为什么,因为显然 spec prohibits let there (尽管它对 const 非常满意)。

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

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

另一方面,如果我们已经在那里设置了一些内容,那么 graph[from] 将已经包含一个我们不想覆盖的列表,因此我们只需附加目的地即可使用 .push 到它。

例如,前三个迭代将建立来自爱丽丝之家的连接。第一个Bob's House。因此,graph["Alice's House"]未定义,我们将["Bob's House"] 放在那里。在下一次迭代中,从 Alice's HouseCabin;但现在 graph["Alice's House"] 不为空,因此我们追加到它,结果是 ["Bob's House", "Cabin"]。运行结束时,我们会知道,如果我们在爱丽丝之家,我们可以去三个可能的地方(鲍勃之家、小屋和邮局)。

关于javascript - Eloquent JavaScript - 机器人项目开始时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156959/

相关文章:

javascript - 请解释一些Javascript正则表达式

javascript - Angular : How do optimize the below if/else statement in angularjs?

javascript - 输入字段出现在默认选中的选择框上

javascript - 这是做 JS OOP 的好方法吗?

javascript - 父组件中的对象属性发生变化时,如何更新子组件中的对象

javascript - react-google-maps 在用户提交后呈现标记

javascript - Mongoose 的正则表达式不传递不从Angular的HTTP服务传递到nodejs

javascript - 找到具有相同颜色的相邻 block

javascript - 有谁知道这是什么 javascript 图形库(或者可以推荐类似的东西)?

javascript - 如何在循环中填写JSON?