Harita anahtarları diziye nasıl dönüştürülür?


237

Diyelim ki şu haritaya sahibim:

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

Ve yukarıdakilere dayanarak ['a', 'b'] elde etmek istiyorum. Mevcut çözümüm çok uzun ve korkunç görünüyor.

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

Daha iyi bir yol olmalı, değil mi?


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


5
@gK. İle çalışmaz Map.
pawel

@pawel Ah üzgünüm o zaman!
hamnix

Array.from(Map.values())- eğer varsa, anahtarlar yerine değerlere ihtiyacınız vardır.
Manohar Reddy Poreddy

Yanıtlar:


436

Map.keys()Bir döner MapIteratordönüştürülebilir nesne Arraykullanılarak Array.from:

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

EDIT: yinelenebilir nesneyi forma sözdizimini kullanarak diziye dönüştürebilirsiniz

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

6
Spread Operator kullanımını seviyorum, ancak TypeScript transpiler'im atıyor this.map.values().slice is not a function. Belki güncellemeliyim.
Cody

4
@Cody, çünkü çağrınız yayılma işlecinden slice()önce yürütülüyor. Deneyin[ ... Array.from(map.values()).slice(0) ]
mgthomas99

5
TypeScript 2.7.2 şunu söylüyor const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];: TS2461: 'IterableIterator <sayı>' tipi bir dizi türü değil. Yani TypeScript'te buna izin verilmiyor. Array.from beklendiği gibi çalışır.
Stefan Rein

@StefanRein Typescript yayılma işleci aynı görünüyor, ancak yalnızca Array ve Nesne türleriyle çalıştığı için ES6 yayılmasına eşdeğer değilken, ES6 herhangi bir yinelenebilirle çalışıyor. Yapmanız örn yapabilirsiniz ..."abc"almak için ["a","b","c"]TS mümkün değildir ES6, içinde.
pawel

@pawel ..."abc"veya ES6'yı ...("abc")destekleyen krom konsolda çalışmıyor musunuz?
Stefan Rein


6

Array.from(myMap.keys()) google uygulama komut dosyalarında çalışmaz.

Kullanmaya çalışmak hatayla sonuçlanır TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }.

GAS'taki anahtarların listesini almak için şunu yapın:

var keysList = Object.keys(myMap);

Bu benim için çalışıyor ve ilk cevap olmadı. Google'ı kullanmıyorum ... ancak map.keys()dönüş değerinin yinelenemediğini söyleyerek bir hata almaya devam ettim.
Azurespot

5

Açısal reaktif form ile benzer bir şeye ihtiyacım var:

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

Tam olarak en iyi soruya cevap değil ama new Array(...someMap)gerekli dizi oluşturmak için hem anahtar hem de değer gerektiğinde bu hile beni birkaç kez kurtardı. Örneğin, hem anahtar hem de değer değerlerine dayalı olarak Harita nesnesinden tepki bileşenleri oluşturmaya ihtiyaç duyulduğunda.

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

1

Tamam, biraz daha kapsamlı olalım ve JavaScript'te bu özelliği bilmeyenler için Harita ile başlayalım ... MDN diyor ki:

Harita nesnesi anahtar / değer çiftlerini tutar ve anahtarların orijinal ekleme sırasını hatırlar.
Herhangi bir değer (hem nesneler hem de ilkel değerler) bir anahtar veya değer olarak kullanılabilir.

Bahsettiğiniz gibi, yeni anahtar kelimeyi kullanarak kolayca Harita örneği oluşturabilirsiniz ... Durumunuzda:

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

Bakalım ...

Bahsettiğiniz yol bunu yapmanın iyi bir yoludur, ancak evet, bunu yapmanın daha kısa yolları vardır ...

Haritanın kullanabileceğiniz birçok yöntemi vardır, örneğin set()anahtar değerlerini atamak için önceden kullandığınız ...

Bunlardan biri, keys()tüm anahtarları döndüren ...

Sizin durumunuzda, geri dönecektir:

MapIterator {"a", "b"}

ve bunları yayma operatörü gibi ES6 yollarını kullanarak kolayca bir Diziye dönüştürürsünüz ...

const b = [...myMap.keys()];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.