我正在学习JS中的数据结构,并编写了一些代码来构建Graph数据结构。
但是似乎有一个我不明白为什么会发生的问题。
请查看有关getGraph()方法的注释。我只是在这里打印列表的大小和列表本身。即使列表中有数据,list.size也将返回0。
我创建了一个单独的地图,添加了数据并打印出来。有用。但是在以下情况下。
class Graph {
constructor() {
this.list = new Map();
}
addVertex(vertex) {
if (!this.list[vertex]) {
this.list[vertex] = [];
console.log("Added", this.list);
} else {
console.log("Vertex already exists!");
}
}
addEdge(vertex, node) {
if (this.list[vertex]) {
if (!(this.list[vertex].indexOf(node) > -1)) {
this.list[vertex].push(node);
} else {
console.log('Node : ' + node + " already added!"); //?
}
} else {
console.log("Vertex " + vertex + " does not exist!")
}
}
getGraph() {
console.log(this.list);
console.log(this.list.size); // List size comes as zero even if I added some nodes and vertices
}
}
var graph = new Graph();
graph.addVertex("1");
graph.addVertex("2");
graph.addVertex("3");
graph.addVertex("1");
graph.addVertex("5");
graph.addVertex("5");
graph.addEdge("1", "3");
graph.addEdge("2", "3");
graph.addEdge("2", "3");
graph.addEdge("12", "3");
graph.getGraph();
答案 0 :(得分:4)
if (!this.list[vertex]) {
this.list[vertex] = [];
这不是与地图内容进行交互的正确方法。这是合法的Javacript,但您要将任意键/值对附加到map对象,而不是实际上在地图中存储东西。
相反,请执行以下操作:
if (!this.list.has(vertex) {
this.list.set(vertex, []);
}
类似地,当您想从地图上获取数据时,不要使用括号语法,请使用this.list.get(vertex)