Javascript 有人能帮我理解这个代码吗?
我不明白图[from]是如何工作的,它是否像在“from”位置的数组中那样检查值?或者“from”是对象的属性名吗?我在终端中尝试了这两种方法,当它是一个数字时,使用from作为属性名是有效的。将其用作数组索引会给我一个“from未定义”的错误。 还有图形[from].push(to)。它是如何工作的Javascript 有人能帮我理解这个代码吗?,javascript,arrays,object,Javascript,Arrays,Object,我不明白图[from]是如何工作的,它是否像在“from”位置的数组中那样检查值?或者“from”是对象的属性名吗?我在终端中尝试了这两种方法,当它是一个数字时,使用from作为属性名是有效的。将其用作数组索引会给我一个“from未定义”的错误。 还有图形[from].push(to)。它是如何工作的 function buildGraph(edges) { let graph = Object.create(null); function addEdge(from, 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);
您有一个道路列表,定义为列表os字符串对,由“-”连接,如
“Alice’s House Bob’s House”
是连接Alice和Bob House的道路
然后,每条道路由两条边组合而成:Alice House和Bob House(您可以使用拆分(“')
)将道路拆分为两条边)
现在您创建了一张道路地图,在这里它被称为graph
。从A->B点和B->A点开始,为每条道路添加两条边
addEdge(from, to);
addEdge(to, from);
因为你们可以用同一条路双向行驶
每个addEdge调用都会检查图中是否已经注册了来自的边。
但我认为应该是这样的:
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']
}
因此,最终您将构建一个地图,它将如下所示:
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']
}
点击您喜爱的浏览器的开发工具。在其中键入以下内容:
let roadsX = [
"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];
} else {
graph[from].push(to);
}
}
for (let [from, to] of edges.map(r => r.split("-"))) {
addEdge(from, to);
addEdge(to, from);
}
return graph;
}
let roadGraphX = buildGraph(roads);
console.log(roadGraphX);
您将看到函数的作用。
addEdge
是一个函数。函数具有在调用时传递的参数addEdge
声明为function addEdge(from,to)
,这意味着在代码中调用函数时,传递到函数中的第一个参数都是from
。例如,如果要从中写入addEdge(1,2)
-,函数内的addEdge
是一个变量。因此,当你在addEdge
函数中说graph[from]
时,你可以把它解释为graph[1]
我猜如果你通过[“蓝-红”,“绿-蓝”]
作为道路
你会得到一个像{blue:[“红”,“绿”],[“蓝”],[蓝]]这样的对象
@karthick我知道addEdge做什么。我只是被graph[from]的语法弄糊涂了。我们将图形创建为空对象。“graph[from]”中的“from”表示什么?graph[from]
是对象属性检索的括号符号。正如@HereticMonkey所说,如果graph是一个对象,您可以通过说graph[“mykey”]=“myvalue”
在graph中设置键值对-这类似于说graph.mykey=“myvalue”
除了使用fomer,您可以使用空格之类的东西,因为您的键是字符串。通过指向graph[“mykey”]
来访问值-还值得注意的是,在代码中[to]
只是一个数组,其中包含to
。您还可以执行graph[from]=[…graph[from]| |[]to]代码>如果你想:)。非常好的内联-我需要记住:)非常感谢你的帮助。您还可以解释一下“graph[from].push(to)”是如何工作的吗?我知道push将元素放在数组的末尾,但graph不是数组,它在这里是如何工作的?@MazharAli graph不是数组,来自内部graph
的键指向数组。例如,graph[“Alice house”].push(“Post office”)
将值“Post office”推送到位于graph[“Alice house”]
的数组中,OP要求解释代码的功能,而不是代码的最终功能。