如何将Map键转换为数组?


236

可以说我有以下地图:

let myMap = new Map().set('a', 1).set('b', 2);

我想根据以上内容获得['a','b']。我当前的解决方案似乎是如此漫长而可怕。

let myMap = new Map().set('a', 1).set('b', 2);
let keys = [];
for (let key of myMap)
  keys.push(key);
console.log(keys);

必须有更好的方法,不是吗?


17
也许吧Array.from(Map.keys())
Dan D.


5
@gK。不适用于Map
pawel,2016年

@pawel哦,对不起!
hamnix

Array.from(Map.values())-如果需要,则需要值而不是键。
Manohar Reddy Poreddy

Answers:


435

Map.keys()返回MapIterator可被转化到目的Array使用Array.from

let keys = Array.from( myMap.keys() );
// ["a", "b"]

编辑:您还可以使用扩展语法将可迭代对象转换为数组

let keys =[ ...myMap.keys() ];
// ["a", "b"]

6
我喜欢使用Spread运算符,但是我的TypeScript Transpiler throws却可以使用this.map.values().slice is not a function。也许我应该更新。
科迪

4
@Cody,这是因为您的slice()调用是在传播运算符之前执行的。试试[ ... Array.from(map.values()).slice(0) ]
mgthomas99 '18

5
TypeScript 2.7.2为此进行const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];了以下说明:TS2461:类型'IterableIterator <number>'不是数组类型。因此在TypeScript中不允许这样做。Array.from可以正常工作。
Stefan Rein

@StefanRein Typescript扩展运算符看起来相同,但不等同于ES6扩展,因为它仅适用于Array和Object类型,而ES6则适用于任何可迭代的函数。您可以这样做..."abc",例如获得["a","b","c"]ES6,这在TS中是不可能的。
pawel

@pawel ..."abc"...("abc")无法在支持ES6的Chrome控制台中工作?
Stefan Rein


6

Array.from(myMap.keys()) 在Google应用程序脚本中不起作用。

尝试使用它会导致错误TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }

要获取GAS中的键列表,请执行以下操作:

var keysList = Object.keys(myMap);

这个对我有用,第一个答案没有。我没有使用Google ...,但不断收到错误消息,指出map.keys()返回值不可迭代。
Azurespot,

5

我需要类似角反应形式的东西:

let myMap = new Map().set(0, {status: 'VALID'}).set(1, {status: 'INVALID'});
let mapToArray = Array.from(myMap.values());
let isValid = mapToArray.every(x => x.status === 'VALID');

2

并不是最好的问题答案,但是new Array(...someMap)当我既需要键又需要值来生成所需数组时,此技巧为我节省了很多时间。例如,当需要根据键和值从Map对象创建react组件时。

  let map = new Map();
  map.set("1", 1);
  map.set("2", 2);
  console.log(new Array(...map).map(pairs => pairs[0])); -> ["1", "2"]

1

好的,让我们更全面一些,从不知道JavaScript中此功能的用户开始使用Map。...MDN说:

Map对象保存键值对,并记住键的原始插入顺序。
任何值(对象值和原始值)都可以用作键或值。

如前所述,您可以使用new关键字轻松创建Map实例...在您的情况下:

let myMap = new Map().set('a', 1).set('b', 2);

让我们来看看...

您提到的方式是可以的,但是是的,还有更简洁的方式...

Map有许多可用的方法,例如set()已经用于分配键值的方法...

其中之一是keys()返回所有键...

就您而言,它将返回:

MapIterator {"a", "b"}

并且您可以使用ES6方式轻松地将它们转换为数组,例如散布运算符...

const b = [...myMap.keys()];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.