javascript - 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% 正确,我深表歉意。但是任何帮助都会很棒。
解决方案
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 或多或少地忽略了使用时null
和undefined
使用时的区别==
(与其更严格的兄弟相反===
)。因此,当图中的起点还没有任何目的地时,我们只需将其设置为包含目的地的单元素列表。
另一方面,如果我们已经在那里设置了一些东西,那么graph[from]
将已经包含一个我们不想覆盖的列表,所以我们只需使用.push
.
例如,前三个迭代将从Alice's House
. 第一个to
是Bob's House
。graph["Alice's House"]
也是如此undefined
,我们把它放在["Bob's House"]
那里。在下一次迭代中,它是 fromAlice's House
到Cabin
; 但是 nowgraph["Alice's House"]
不是空的,所以我们追加到它上面,结果是["Bob's House", "Cabin"]
. 在运行结束时,我们会知道如果我们在 Alice's House,我们可以去三个可能的地方(Bob's House、Cabin 和 Post Office)。
推荐阅读
- android - 调用 FirebaseInstanceId.getToken 的行为
- javascript - MVC 导航栏主页按钮获取请求的问题
- amazon-web-services - 保护 S3 资产免遭直接下载
- python - Errno 2 没有这样的文件或目录:'/storage/test.txt'
- docker - Does Docker image supporting Nvidia gpu on a cpu machine
- google-apps-script - script to split a string google sheet
- ios - ionic2-calendar/calendar time difference
- rdf - 如何提取/获取本体中的所有术语(类/属性)
- assembly - 如何在文本模式程序集中换行
- raspberry-pi3 - raspberry pi 3 + windows 10 iot changing password makes device inacessible