Using map() on an iterator

后端 未结 8 1796
误落风尘
误落风尘 2021-02-01 11:59

Say we have a Map: let m = new Map();, using m.values() returns a map iterator.

But I can\'t use forEach() or map() o

8条回答
  •  有刺的猬
    2021-02-01 12:23

    The simplest and least performant way to do this is:

    Array.from(m).map(([key,value]) => /* whatever */)
    

    Better yet

    Array.from(m, ([key, value]) => /* whatever */))
    

    Array.from takes any iterable or array-like thing and converts it into an array! As Daniel points out in the comments, we can add a mapping function to the conversion to remove an iteration and subsequently an intermediate array.

    Using Array.from will move your performance from O(1) to O(n) as @hraban points out in the comments. Since m is a Map, and they can't be infinite, we don't have to worry about an infinite sequence. For most instances, this will suffice.

    There are a couple of other ways to loop through a map.

    Using forEach

    m.forEach((value,key) => /* stuff */ )
    

    Using for..of

    var myMap = new Map();
    myMap.set(0, 'zero');
    myMap.set(1, 'one');
    for (var [key, value] of myMap) {
      console.log(key + ' = ' + value);
    }
    // 0 = zero
    // 1 = one
    

提交回复
热议问题