Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript - get index in Map.prototype.forEach()

Map.prototype.forEach takes callback with two params: value and key. Is it possible to get the index of each entry, similar to Array.prototype.forEach((value, index) => {})

like image 733
eagor Avatar asked Jul 11 '16 18:07

eagor


People also ask

Can I get index in map JavaScript?

In JavaScript, you can use a map index by applying the “map()” method for printing the index of each element in an array. The map() method works for each element in an array with no change in the original array. It can be utilized for mapping the array values along with their indexes.

How do you find the index on a map?

The index is used inside map() method to state the position of each element in an array, but it doesn't change the original array. Syntax: array. map(function(currentelement, index, arrayobj) { // Returns the new value instead of the item });

Can you use forEach on a map?

forEach method is used to loop over the map with the given function and executes the given function over each key-value pair. Parameters: This method accepts four parameters as mentioned above and described below: callback: This is the function that executes on each function call.

What is the difference between forEach () and map ()?

Differences between forEach() and map() methods:The forEach() method does not create a new array based on the given array. The map() method creates an entirely new array.


2 Answers

Map.prototype.forEach takes callback with two params: value and key.

No, it's invoked with three arguments, just like Array#forEach. The third is the map.

Is it possible to get the index of each entry, similar to Array.prototype.forEach(functcion(value, index) => {})

(Fairly sure the functcion part of that wasn't meant to be there.)

That's what key is. There is no separate "index."

Map's iteration order is defined for various iteration operations, but there's no direct iteration construct that gives you the index (as opposed to key) of an entry in that order. The order is original key insertion order, so for instance:

const m = new Map();
m.set("x", 1);
m.set("q", 2);
m.set("z"), 3);
m.set("x", "one");

If we loop through that map, we'll see the keys in the order the key was first added, so "x", "q", "z". Note that changing the value of the entry with the ke "x" didn't move it to the end.

Map#forEach (and for-of and anything else using the map's iterator) follows the iteration order, so if you're thinking of the index in terms of that order, you could track the index yourself:

const m = new Map();
m.set("one", "uno");
m.set("two", "due");
m.set("three", "tre");
let index = 0;
m.forEach((value, key) => {
  console.log(index++, key, value);
});

Alternately, you can get an array of the map entries (as [key, value] arrays):

let entries = Array.from(m.entries());

...and use the indexes of that array:

I'm just not sure what it buys you. :-)

like image 82
T.J. Crowder Avatar answered Sep 28 '22 06:09

T.J. Crowder


I don't think so. Map object is a key/value map. To me at least the idea of an index doesn't make much sense, given that the order of the key/value pairs should not be guaranteed in a Map. If you are just curious how many pairs you have iterated on so far, you could just keep a counter that you mutate on each call, something like:

mapObj.forEach(() => {
    let i=0;
    return (key, value) => {
        // whatever you are doing with each key/value
        i += 1;
    }
});

It is not as elegant as an index as parameter, but would at least meet your needs.

like image 44
varfoo Avatar answered Sep 28 '22 07:09

varfoo