Como converter chaves de mapa em array?

237

Digamos que eu tenho o seguinte mapa:

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

E eu quero obter ['a', 'b'] com base no acima. Minha solução atual parece tão longa e horrível.

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

Deve haver uma maneira melhor, não?

Lilleman
fonte
17
Talvez Array.from(Map.keys()).
11116 Dan D.
5
@gK. Isso não funciona Map.
Pawel
@pawel Oh desculpe então!
11136 hamnix
Array.from(Map.values())- se for o caso, você precisa de valores, em vez de chaves.
Manohar Reddy Poreddy 22/06

Respostas:

436

Map.keys()retorna um MapIteratorobjeto que pode ser convertido Arrayusando Array.from:

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

EDIT: você também pode converter objetos iteráveis ​​em array usando a sintaxe de propagação

let keys =[ ...myMap.keys() ];
// ["a", "b"]
pawel
fonte
6
Mas eu gosto do uso do Spread Operator, meu transpiler TypeScript this.map.values().slice is not a function. Talvez eu deva atualizar.
Cody
4
@ Cody, porque sua slice()chamada está sendo executada antes do operador de propagação. Tente[ ... Array.from(map.values()).slice(0) ]
mgthomas99
5
O TypeScript 2.7.2 diz const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];o seguinte: TS2461: O tipo 'IterableIterator <número>' não é um tipo de matriz. Portanto, isso não é permitido no TypeScript. Array.from funciona conforme o esperado.
11138 Stefan Rein #
O operador de propagação @StefanRein Typescript parece o mesmo, mas não é equivalente à propagação do ES6, pois só funciona com os tipos Array e Object, enquanto o ES6 funciona com qualquer iterável. Você pode, por exemplo, fazer ..."abc"para entrar ["a","b","c"]no ES6, o que não é possível no TS.
Pawel
@pawel ..."abc"nem ...("abc")está trabalhando no console do Chrome, que suporta o ES6?
Stefan Rein
15

Você pode usar o operador spread para converter o iterador Map.keys () em uma matriz.

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

Fernando Carvajal
fonte
6

Array.from(myMap.keys()) não funciona nos scripts de aplicativos do google.

Tentar usá-lo resulta no erro TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }.

Para obter uma lista de chaves no GAS, faça o seguinte:

var keysList = Object.keys(myMap);
Joman68
fonte
Este funciona para mim, e a primeira resposta não. Não estou usando o Google ... mas recebi um erro dizendo que o map.keys()valor de retorno não é iterável.
Azurespot 9/10/19
5

Preciso de algo semelhante à forma reativa angular:

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');
linfluX
fonte
2

Não é exatamente a melhor resposta para a pergunta, mas esse truque new Array(...someMap)me salvou algumas vezes quando eu preciso de chave e valor para gerar a matriz necessária. Por exemplo, quando é necessário criar componentes de reação do objeto Map com base nos valores de chave e valor.

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

OK, vamos ser um pouco mais abrangentes e começar com o que é o mapa para quem não conhece esse recurso em JavaScript ... MDN diz:

O objeto Map contém pares de valores-chave e lembra a ordem de inserção original das chaves.
Qualquer valor (objetos e valores primitivos) pode ser usado como uma chave ou um valor.

Como você mencionou, você pode criar facilmente uma instância do Map usando a nova palavra-chave ... No seu caso:

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

Então vamos ver ...

A maneira como você mencionou é uma boa maneira de fazer isso, mas sim, existem maneiras mais concisas de fazer isso ...

O mapa tem muitos métodos que você pode usar, como os set()que você já usou para atribuir os valores-chave ...

Uma delas é keys()que retorna todas as chaves ...

No seu caso, ele retornará:

MapIterator {"a", "b"}

e você os converte facilmente em uma matriz usando maneiras ES6 , como operador de propagação ...

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