Let say I have an array of points = [[1,3],[-2,2] which represent x, y coordinates.
I want to access these values (distances of two points) at the points [x,y]. I just can’t get my mind wrapped on how these two approaches are different.
Why do I have access to one hash maps value, and the next I received undefined?
function getDistances1(points) { const lookup = new Map(); // Destructing with a for of for (const [x, y] of points) { let distance = Math.sqrt((x**2) + (y**2)) lookup.set([x,y], distance) } // I won't have access to the value of the array when I try to retrieve the value from the hash map return lookup; } function getDistances2(points) { const lookup = new Map(); // Destructing with a traditional for loop for (let i = 0; i < points.length; i++) { // Destruct this way const [x, y] = [...points[i]] let distance = Math.sqrt((x**2) + (y**2)) lookup.set(points[i], distance) } // I have access to this points value return lookup; // } const coordinates = [[1,3],[-2,2]] const distance1 = getDistances1(coordinates); const distance2 = getDistances2(coordinates); console.log(distance2.get(coordinates[0])) //-> 3.1622776601683795 ; console.log(distance1.get(coordinates[0])) // undefined
Answer
The reason that getDistances1
doesn’t work is that you’re creating separate x
and y
variables here:
for (const [x, y] of points) {
and then creating a new array here:
lookup.set([x,y], distance)
But you’re trying to look up the information using the array that was in points
. The information isn’t stored under that array, you’ve stored it under a new array instead.
You could do this (see ***
comments):
function getDistances1(points) { const lookup = new Map(); // Destructing with a for of for (const point of points) { // *** Use the array from `points const [x, y] = point; // *** Convenient destructuring let distance = Math.sqrt((x**2) + (y**2)) lookup.set(point, distance); // *** Store keyed by the array } return lookup; }