11

When using the Javascript built in Map, how do you use .map() to iterate over the keys?

I know the for...of can be used as shown below:

const map = new Map();

map.set(0, 'Zero');
map.set(1, 'One');
map.set(2, 'Two');

for (let key of map.keys()) {
  console.log(key);
}

But this code will fail:

map.keys().map(key => {
  console.log(key);
});

6 Answers 6

7

Map.keys() returns an iterator you can spread the iterator using spread syntax

const map = new Map();

map.set(0, 'Zero');
map.set(1, 'One');
map.set(2, 'Two');

[...map.keys()].forEach(key => {
  console.log(key);
})

Sign up to request clarification or add additional context in comments.

2 Comments

There's no need to spread when using for..of because it conforms to the iterator protocol already.
@georg oops my bad !!, i meant to spread and then use any of the array method, updated, thanks for pointing out
6

It's Array.prototype.map actually, it's defined for arrays, so use Array.from to convert the keys to an array and then use map:

const map = new Map();

map.set(0, 'Zero');
map.set(1, 'One');
map.set(2, 'Two');

console.log(...Array.from(map.keys()).map(key => {
  return key ** 2; // square the keys
}));

Comments

3

You can use Array.from():

const map = new Map();

map.set(0, 'Zero');
map.set(1, 'One');
map.set(2, 'Two');

Array.from(map.keys()).map(key => {
  console.log(key);
});

Hopefully that helps!

Comments

2

You might be better off using Array.from mapping function directly to avoid creating a temporary array:

Array.from(map.keys(), k => console.log(k))

Another, more verbose, but helpful option would be to redefine array iteration methods on the iterator prototype, thus making them automatically available for all iterators:

// http://www.ecma-international.org/ecma-262/7.0/#sec-%iteratorprototype%-object
const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));

Object.defineProperties(IteratorPrototype, {
    forEach: {
        value: function (fn) {
            let n = 0;

            for (let x of this) {
                fn(x, n++, this);
            }
        },
        enumerable: false
    },
    
    map: {
        value: function (fn) {
            let n = 0, a = [];

            for (let x of this) {
                a.push(fn(x, n++, this));
            }

            return a;
        },
        enumerable: false
    },
    
    reduce: {
        value: function (fn, init) {
            let n = 0;

            if (arguments.length === 1) {
                init = this.next().value;
            }

            for (let x of this) {
                init = fn(init, x, n++, this);
            }

            return init;
        },
        enumerable: false
    },

});


/////

const map = new Map();

map.set('a', 'Zero');
map.set('b', 'One');
map.set('c', 'Two');

map.keys().map(console.log)

console.log(map.values().reduce((o, k) => o + '/' + k));

function* it() {
    yield 'x';
    yield 'y';
    yield 'z';
}

it().map(x => console.log(x))

Comments

1
map.forEach((_,key) => console.log(key));

Comments

0

const map = new Map([[0, "Zero"], [1, "One"], [2, "Two"]]);
    
const arr = Array.from(map, (entry) => ({ key: entry[0], value: entry[1] })); 

console.log(arr); 
         

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.