I am trying to learn graph datastructure and found this weird behaviour by consoling the current data, my main code is as follows
class Graph { constructor() { this.adjacencyList = {}; } addVertex(vertex) { if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = []; } addEdge(v1, v2) { this.adjacencyList[v1].push(v2); this.adjacencyList[v2].push(v1); } removeEdge(v1, v2) { this.adjacencyList[v1] = this.adjacencyList[v1].filter((el) => el !== v2); this.adjacencyList[v2] = this.adjacencyList[v2].filter((el) => el !== v1); } }
and my console logs were
let graph = new Graph(); graph.addVertex("tokyo"); graph.addVertex("dallas"); graph.addVertex("aspen"); graph.addEdge("tokyo", "dallas"); graph.addEdge("dallas", "aspen"); console.log(graph.adjacencyList); graph.removeEdge("dallas", "tokyo"); console.log(graph.adjacencyList);
what I normally expected was the first console.log before removing should contain the edges and the after would contain the edges after removed, that is what I also see in the object
{tokyo: Array(1), dallas: Array(2), aspen: Array(1)} {Tokyo: Array(0), dallas: Array(1), aspen: Array(1)}
{tokyo: Array(1), dallas: Array(2), aspen: Array(1)}
{Tokyo: Array(0), dallas: Array(1), aspen: Array(1)}
but when I open up the object I don’t see the expected values in object 1
aspen: ['dallas'] dallas: ['aspen'] Tokyo: []
This is exactly the same for the second object in console.log
The behavior you’re observing is related to the case sensitivity of JavaScript object keys. In JavaScript, object keys are case-sensitive. In your removeEdge method, when you filter the array, you are using el !== v2, where v2 is “Tokyo” (with an uppercase “T”). However, in your graph, the vertex is stored as “tokyo” (with a lowercase “t”). JavaScript treats these as different keys.
removeEdge
el !== v2
v2
To fix this issue, you can ensure that the vertices are consistently stored in a specific case, for example, in lowercase. You can modify your addVertex and other methods to ensure this consistency:
addVertex
class Graph { constructor() { this.adjacencyList = {}; } addVertex(vertex) { const lowerVertex = vertex.toLowerCase(); if (!this.adjacencyList[lowerVertex]) this.adjacencyList[lowerVertex] = []; } addEdge(v1, v2) { const lowerV1 = v1.toLowerCase(); const lowerV2 = v2.toLowerCase(); this.adjacencyList[lowerV1].push(lowerV2); this.adjacencyList[lowerV2].push(lowerV1); } removeEdge(v1, v2) { const lowerV1 = v1.toLowerCase(); const lowerV2 = v2.toLowerCase(); this.adjacencyList[lowerV1] = this.adjacencyList[lowerV1].filter((el) => el !== lowerV2); this.adjacencyList[lowerV2] = this.adjacencyList[lowerV2].filter((el) => el !== lowerV1); } }
With these changes, your graph’s vertices will be consistently stored in lowercase, and you should get the expected behavior in your console.log statements.
console.log