如何将Map键转换为数组?

Lil*_*man 165 javascript dictionary ecmascript-6

可以说我有以下地图:

let myMap = new Map().set('a', 1).set('b', 2);
Run Code Online (Sandbox Code Playgroud)

我希望根据以上内容获得['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);
Run Code Online (Sandbox Code Playgroud)

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

paw*_*wel 327

Map.keys()返回一个MapIterator可以转换为Array使用的对象Array.from:

let keys = Array.from( myMap.keys() );
// ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

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

let keys =[ ...myMap.keys() ];
// ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢使用Spread运算符,但我的TypeScript转换器会抛出`this.map.values().slice不是函数`.也许我应该更新. (6认同)
  • TypeScript 2.7.2为此说:`const fooMap = new Map <number,string>(); const fooArray = [... fooMap.keys()];`以下内容:TS2461:类型'IterableIterator <number>'不是数组类型.所以这在TypeScript中是不允许的.Array.from按预期工作. (4认同)
  • @Cody那是因为你的`slice()`调用正在扩展运算符之前执行.试试`[... Array.from(map.values()).slice(0)]` (3认同)

Ali*_*eza 15

好吧,让我们更全面地了解一下,对于那些不知道 JavaScript 中的这个功能的人来说,先从什么是Map开始……MDN 说:

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

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

let myMap = new Map().set('a', 1).set('b', 2);
Run Code Online (Sandbox Code Playgroud)

那么让我们看看...

您提到的方法是一种不错的方法,但是是的,还有更简洁的方法可以做到这一点......

Map有许多可以使用的方法,就像set()您已经用来分配键值的方法一样......

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

在你的情况下,它将返回:

MapIterator {"a", "b"}
Run Code Online (Sandbox Code Playgroud)

你可以使用ES6方式轻松将它们转换为数组,例如扩展运算符......

const b = [...myMap.keys()];
Run Code Online (Sandbox Code Playgroud)


Fer*_*jal 11

您可以使用spread运算符转换Array中的Map.keys()迭代器.

let myMap = new Map().set('a', 1).set('b', 2).set(983, true)
let keys = [...myMap.keys()]
console.log(keys)
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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');
Run Code Online (Sandbox Code Playgroud)


小智 6

不完全是问题的最佳答案,但当new Array(...someMap)我需要键和值来生成所需的数组时,这个技巧救了我几次。例如,当需要根据键和值从 Map 对象创建反应组件时。

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