Come convertire le chiavi della mappa in array?


237

Diciamo che ho la seguente mappa:

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

E voglio ottenere ['a', 'b'] in base a quanto sopra. La mia attuale soluzione sembra così lunga e orribile.

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

Deve esserci un modo migliore, no?


17
Forse Array.from(Map.keys()).
Dan D.


5
@gK. Non funziona con Map.
Pawel,

@pawel Oh scusa allora!
Hamnix,

Array.from(Map.values())- se nel caso, hai bisogno di valori, anziché di chiavi.
Manohar Reddy Poreddy il

Risposte:


436

Map.keys()restituisce un MapIteratoroggetto che può essere convertito in Arrayusando Array.from:

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

EDIT: puoi anche convertire oggetti iterabili in array usando la sintassi diffusa

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

6
Mi piace l'uso di Spread Operator, tuttavia, il mio transpiler TypeScript genera this.map.values().slice is not a function. Forse dovrei aggiornare.
Cody,

4
@Cody è perché la tua slice()invocazione viene eseguita prima dell'operatore di diffusione. Prova[ ... Array.from(map.values()).slice(0) ]
mgthomas99

5
TypeScript 2.7.2 dice per questo: const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];quanto segue: TS2461: il tipo 'IterableIterator <number>' non è un tipo di array. Quindi questo non è consentito in TypeScript. Array.from funziona come previsto.
Stefan Rein,

L'operatore di diffusione @StefanRein Typescript ha lo stesso aspetto, ma non equivale alla diffusione ES6, poiché funziona solo con tipi di array e oggetti, mentre ES6 funziona con qualsiasi iterabile. Ad esempio , è possibile ..."abc"accedere ["a","b","c"]a ES6, cosa impossibile in TS.
Pawel,

@pawel ..."abc"...("abc")funzionano nella console di Chrome, che supporta ES6?
Stefan Rein,

15

È possibile utilizzare l'operatore spread per convertire l' iteratore Map.keys () in un array.

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


6

Array.from(myMap.keys()) non funziona negli script dell'applicazione Google.

Tentare di usarlo provoca l'errore TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }.

Per ottenere un elenco di chiavi in ​​GAS, procedere come segue:

var keysList = Object.keys(myMap);

Questo funziona per me e la prima risposta no. Non sto usando Google ... ma continuo a ricevere un errore che dice che il map.keys()valore restituito non è modificabile.
Azurespot

5

Ho bisogno di qualcosa di simile con la forma reattiva angolare:

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

Non è esattamente la migliore risposta alla domanda, ma questo trucco new Array(...someMap)mi ha salvato un paio di volte quando ho bisogno sia della chiave che del valore per generare l'array necessario. Ad esempio, quando è necessario creare componenti di reazione dall'oggetto Mappa in base a valori chiave e di valore.

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

1

OK, andiamo un po 'più esaustivi e iniziamo con ciò che è Mappa per coloro che non conoscono questa funzione in JavaScript ... MDN dice:

L'oggetto Mappa contiene coppie chiave-valore e ricorda l'ordine di inserimento originale delle chiavi.
Qualsiasi valore (sia oggetti che valori primitivi) può essere usato come chiave o valore.

Come hai detto, puoi facilmente creare un'istanza di Map usando una nuova parola chiave ... Nel tuo caso:

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

Quindi vediamo ...

Il modo in cui hai menzionato è un modo OK per farlo, ma sì, ci sono modi più concisi per farlo ...

Mappa ha molti metodi che puoi usare, come quelli set()che hai già usato per assegnare i valori chiave ...

Uno di questi è keys()che restituisce tutte le chiavi ...

Nel tuo caso, restituirà:

MapIterator {"a", "b"}

e li converti facilmente in un array usando i modi ES6 , come l'operatore di diffusione ...

const b = [...myMap.keys()];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.