Map型したい(Map
)
1const map = new Map();
Map
型は、ECMAScript2015(ES6)で追加されたビルトイン型で、Object型と同じ、キーと値の組み合わせ(Key-Value Pair)を持つデータ構造です。
new Map()
コンストラクターでMapを初期化できます。
Object型と異なり、プロパティの追加順が保証されています。 また、キーや値にオブジェクトとプリミティブ値を使用できたりします。 大量のデータを扱う場合には、Object型よりパフォーマンスがよいそうです。
1const map = new Map([
2 ["key1", "a1"],
3 ["key2", "b1"],
4 ["key3", "c1"],
5])
[key, value]
ペアを要素にもつ2次元配列を与えて初期化できます。
値を追加したい(Map.set
)
1const map = new Map();
2map.set("key1", "a1");
3map.set("key2", "b1");
4map.set("key3", "c1");
set
メソッドで値(Key-Value Pair
)を追加できます。
1map.get("key1"); // -> a1
2map.get("NO_KEY"); // -> undefined
get
メソッドでキーを指定して、値を取得できます。
存在しないキーを指定した場合はundefined
になります。
1map.delete("key2"); // -> true
2map.delete("NO_KEY"); // -> false
delete
メソッドで指定したキーを削除できます。
返り値はBoolean
になっているので、削除できたかどうかの判定に利用できます。
1// キーの確認
2if (map.has("key3")) {
3 // キーが存在するときの処理
4}
has
メソッドで、キーが存在するか確認できます。
1map.size(); // -> 3
size
メソッドで、Mapオブジェクトの要素数を取得できます。
値を確認したい
1console.log(map); // -> {}
2// Arrayに変換すると確認しやすい
3Array.from(map); // -> [[キー, 値]]
4Array.from(map.entries()); // -> [[キー, 値]]
5Array.from(map.keys()); // -> [キー]
6Array.from(map.values()); // -> [値]
.keys
、.values
、.entries
でMap
オブジェクトのプロパティを取得できます。
ただし、そのまま出力しても{}
と表示されるだけです。
Array.from
で配列に変換すると確認しやすいです。
キー名を変更したい
1if (map.has("oldKey")) {
2 map.set("newKey", map.get("oldKey"));
3 map.delete("oldKey");
4}
キー名を直接変更するメソッドはありませんが、has
、set
、get
、delete
を総動員させるとできます。
キーの順番が変更されるので注意が必要です。
キーの順番をソートしたい
1const sorted = [...sourceMap.entries()].sort((a, b) => {
2 // キーを文字列として比較
3 return a[0].localCompare(b[0]);
4 })
5const sortedMap = new Map(sorted);
ループしたい
1// for...ofループ
2for (const [key, value] of map) {
3 console.log(`${key}=${value}`);
4}
グループ化したい(Map.groupBy
)
1Map.groupBy(反復可能なオブジェクト, 条件を定義した関数)
2// -> それぞれのグループのキーを持つMapオブジェクト
配列にしたい
1Array.from(map.entries());
2Array.from(map.keys());
3Array.from(map.values());
Array.from
で配列に変換できます。
オブジェクトにしたい
1Object.from(map.entries());
Object.from
でオブジェクトに変換できます。
特定のキーを取得したい
1// 取得したいキー
2const filterKeys = new Set(["key1", "key2"]);
3
4// 中間処理
5const filtered = Array.from(sourceMap.entries()).filter(([key, value])) => filterKeys.has(key);
6// -> [ [key1, value1], [key3, value3] ]
7
8const filteredMap = new Map(filtered);
9// -> Map { "key1": value1, "key3": value3 }
Map.entries
で配列に変換し、filter
メソッドを使うことで、
Mapオブジェクトから特定のキー(とその値)を抽出できます。