在第 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 或多或少地忽略了 null
和 undefined
之间的区别(而不是它更严格的兄弟 == =
)。因此,当起点在图中还没有任何目的地时,我们只需将其设置为包含目的地的单元素列表。
另一方面,如果我们已经在那里设置了一些内容,那么 graph[from]
将已经包含一个我们不想覆盖的列表,因此我们只需附加目的地即可使用 .push
到它。
例如,前三个迭代将建立来自爱丽丝之家
的连接。第一个到
是Bob's House
。因此,graph["Alice's House"]
是未定义
,我们将["Bob's House"]
放在那里。在下一次迭代中,从 Alice's House
到 Cabin
;但现在 graph["Alice's House"]
不为空,因此我们追加到它,结果是 ["Bob's House", "Cabin"]
。运行结束时,我们会知道,如果我们在爱丽丝之家,我们可以去三个可能的地方(鲍勃之家、小屋和邮局)。
关于javascript - Eloquent JavaScript - 机器人项目开始时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156959/