如何将地图键转换为数组?

假设我有以下地图:

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);

一定有更好的办法,不是吗?

506687 次浏览

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

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

编辑:你也可以使用传播的语法将可迭代对象转换为数组

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

可以使用展开操作符转换数组中的Map.keys() .key .迭代器。

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

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

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');

好吧,让我们更全面一点,为那些不了解JavaScript中这个特性的人从地图开始……MDN说:

Map对象保存键值对并记住原始值 键的插入顺序。
任何值(包括对象和原语)

. Values)可以作为键或值使用
如你所述,你可以使用new关键字轻松创建Map实例… 在你的例子中:

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

让我看看……

你提到的方法是一种不错的方法,但是是的,还有更简洁的方法来做到这一点……

地图有很多你可以使用的方法,比如set(),你已经用它来分配键值了…

其中一个是keys(),它返回所有的键…

在你的例子中,它将返回:

MapIterator {"a", "b"}

并且你可以使用ES6方式轻松地将它们转换为数组,比如展开运算符…

const b = [...myMap.keys()];

不是最好的答案,但这个技巧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"]