次のような地図があるとしましょう。
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);
もっと良い方法があるに違いない。
Map.keys()
は、 Array.from
を使用してMapIterator
に変換できるArray
オブジェクトを返します。
let keys = Array.from( myMap.keys() );
// ["a", "b"]
編集: スプレッド構文を使用して反復可能なオブジェクトを配列に変換することもできます
let keys =[ ...myMap.keys() ];
// ["a", "b"]
スプレッド演算子を使用して、配列内のMap.keys()イテレータを変換できます。
let myMap = new Map().set('a', 1).set('b', 2).set(983, true)
let keys = [...myMap.keys()]
console.log(keys)
質問に対する正確な最善の答えではありませんが、必要な配列を生成するためにキーと値の両方が必要なときに、この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"]
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');
さて、もう少し包括的に進み、JavaScriptでこの機能を知らない人のためのMapから始めましょう... MDNによると、
Mapオブジェクトはキーと値のペアを保持し、キーの元の挿入順序を覚えています。
任意の値(オブジェクトとプリミティブ値の両方)をキーまたは値として使用できます。
すでに述べたように、新しいキーワードを使用してMapのインスタンスを簡単に作成できます。
let myMap = new Map().set('a', 1).set('b', 2);
それでは見てみましょう...
あなたが言及した方法はそれを行うためのOKの方法ですが、そう、それを行うためのもっと簡潔な方法があります...
Mapには、すでにキー値を割り当てるために使用していたset()
のように、使用できる多くのメソッドがあります。
その一つがkeys()
で、これはすべてのキーを返します...
あなたの場合は、それが返されます:
MapIterator {"a", "b"}
そして、あなたは簡単にES6の方法を使って、それらを配列に変換します。
const b = [...myMap.keys()];
Array.from(Map.keys())
は、Googleのアプリケーションスクリプトでは機能しません。
使用しようとすると、エラーTypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }
が発生します。
GASでキーのリストを取得するには、これを行います。
var keysList = Object.keys(myMap);