マップキーを配列に変換する方法は?


237

次のマップがあるとしましょう:

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

もっと良い方法があるに違いない?


17
たぶんArray.from(Map.keys())
Dan D.


5
@gK。では動作しませんMap
パウェル

@pawelああすみません!
ハムニックス2016

Array.from(Map.values())-必要な場合は、キーではなく値が必要です。
Manohar Reddy Poreddy

回答:


436

Map.keys()MapIteratorArray使用してに変換できるオブジェクトを返しますArray.from

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

編集:スプレッド構文を使用して反復可能なオブジェクトを配列に変換することもできます

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

6
ただし、Spread Operatorの使用は好きですが、TypeScriptトランスパイラーがスローしthis.map.values().slice is not a functionます。たぶん更新する必要があります。
コーディ

4
@Cody slice()は、呼び出しがスプレッドオペレーターの前に実行されているためです。試してみる[ ... Array.from(map.values()).slice(0) ]
mgthomas99 2018年

5
TypeScript 2.7.2はこれについてconst fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];次のように述べています。TS2461:タイプ 'IterableIterator <number>'は配列タイプではありません。したがって、これはTypeScriptでは許可されていません。Array.fromは期待どおりに動作します。
Stefan Rein

@StefanRein Typescriptスプレッド演算子は同じように見えますが、ES6は配列型とオブジェクト型でのみ機能するため、ES6は反復可能で機能するため、ES6スプレッドと同等ではありません。たとえば、TSでは不可能なES6 ..."abc"を取得することができ["a","b","c"]ます。
パウェル

@pawel ..."abc"...("abc")、ES6をサポートするChrome コンソールで動作していませんか?
Stefan Rein


6

Array.from(myMap.keys()) googleアプリケーションスクリプトでは機能しません。

使用しようとすると、エラーが発生しますTypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }

GASでキーのリストを取得するには、次のようにします。

var keysList = Object.keys(myMap);

これは私にとってはうまくいきましたが、最初の答えはうまくいきませんでした。私はGoogleを使用していません...しかし、map.keys()戻り値が反復可能ではないというエラーが表示され続けました。
Azurespot

5

私は角度反応型と同様のものが必要です:

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

質問に対する正確な回答とは言えませんが、このトリック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"]

1

それでは、もう少し包括的に見て、JavaScriptでこの機能を知らない人のためのマップから始めましょう... MDNはこう言っています:

Mapオブジェクトはキーと値のペアを保持し、キーの元の挿入順序を記憶しています。
任意の値(オブジェクトとプリミティブ値の両方)をキーまたは値として使用できます。

あなたが述べたように、新しいキーワードを使用してマップのインスタンスを簡単に作成できます...あなたの場合:

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

それでは、見てみましょう...

あなたが言及した方法はそれを行うには良い方法ですが、はい、それを行うためのより簡潔な方法があります...

マップにset()、キー値を割り当てるためにすでに使用したような、使用できる多くのメソッドがあります...

それらの1つは、keys()すべてのキーを返すものです...

あなたの場合、それは戻ります:

MapIterator {"a", "b"}

そして、spreadオペレーターのようなES6の方法を使用して、それらを配列に簡単に変換します...

const b = [...myMap.keys()];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.