JavaScriptES2015映射中的第一项

我的 Map是这样的:

const m = new Map();
m.set('key1', {})
.
m.set('keyN' {})

Map可以有1个或多个项目。我可以通过索引得到第一个项目,没有 m.get('key1')和没有迭代器循环?

喜欢: m.get()[0]

86127 次浏览

Use the Map.prototype.entries function, like this

const m = new Map();
m.set('key1', {})
m.set('keyN', {})


console.log(m.entries().next().value); // [ 'key1', {} ]


If you want to get the first key, then use Map.prototype.keys, like this

console.log(m.keys().next().value); // key1

Similarly if you want to get the first value, then you can use Map.prototype.values, like this

console.log(m.values().next().value); // {}

The reason why we have to call next() on the returned values is that, all those functions return iterators. Read more about the iteration protocol here.

For the specific example you are wondering about, destructuring would be perfect.

let m = new Map();
m.set('key1', {});
m.set('key2', {});


let [[, obj]] = m;

e.g.

let [pair] = m;
let [key, obj] = pair;

is one option to destructure and then grab the value, but the easier option would be

let [obj] = m.values();

Also, that is correct for both Set and Map: you can convert anything to Array and then get any element by its index. Something like this:

const m = new Map();
m.set('key1', {});
m.set('key2', {});


console.log(Array.from(m)[0]); // ['key1', {}]

It could also be done using the spread feature at ES6 and the next versions. Let's declare a new Map variable, then add two values. After that, we will use ... to convert the map into array or you can use Array.from then to get the first element just use [0] on the gotten array.

const m = new Map();
m.set('key1', 1);
m.set('key2', 2);


console.log([...m][0]);    // ['key1', 1] 👍🏼

Or quickly by using distruct feature for javascript array, so that [k, v] array refers to first item at the map.

const [[k, v]] = m;
console.log(k, v); // 'key1', 1

For all iterable objects you can use the iterator object[Symbol.iterator]().

In our case this will point to the entries() method as explained in the above MDN page :

The map iterator function, which is the entries() function by default.

const m = new Map();
m.set('key1', {})
m.set('keyN', {})


console.log(m[Symbol.iterator]().next().value); // [ 'key1', {} ]

And here is a benchmark of all solutions : https://jsbench.me/9fkpm6q9y0/1

The entries() version wins but it is very tight to the iterator version. This is logical since [Symbol.iterator]() calls entries().