JavaScriptのMapオブジェクトを使ってみます。
Mapオブジェクト
Mapオブジェクトはキーと値のペアを持つオブジェクトで、Objectとの違いの例は以下の通りです。
- キーに数値や真偽値など、あらゆる型を使用できる
- キーの順序が追加した順番で保持される
- キーの数をsizeプロパティで簡単に取得できる
- for…ofなどで反復可能
Mapオブジェクトはnew Map()で作成できます。
キーと値をセットにした2次元配列を引数に与えることで、初期値に設定できます。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], [123, 456], [true, false], [[1,2], [3,4]], ['name', 'nozomi'], ['user', 'sophia'], ]); console.log(mapObj); // Map(6) {'name' => 'nozomi', 'id' => 214, 123 => 456, [1,2] => [3,4], true => false, 'user' => 'sophia'}
上記で試している通り、真偽値や配列をキーとしても設定でき、並び順も設定した順番で保持されています。
new Map()のデモページ
set()を使って要素を追加できます。
const mapObj = new Map(); // 要素の追加 mapObj.set('name', 'sophia'); mapObj.set('id', 214); console.log(mapObj); // Map(2) {'name' => 'sophia', 'id' => 214}
注意点として、Mapオブジェクトとして作成したものをObjectのように操作すると一見動作していそうに見えますが、Mapオブジェクトとして使用できません。
const mapObj = new Map(); // Objectのように追加 mapObj['name'] = 'sophia'; mapObj['id'] = 214; console.log(mapObj); // Map(0) {name: 'sophia', id: 214, size: 0} // Mapオブジェクトとして操作できない console.log(mapObj.size); // 0 console.log(mapObj.has('name')); // false
要素を追加する場合は前述のset()を使用するようにしてください。
Objectのように追加した場合のデモページ
値の取得はget()でキーを指定します。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); console.log(mapObj.get('name')); // sophia
前述の通り、sizeで要素の数を取得できます。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); console.log(mapObj.size); // 2
特定のキーがあるかどうかはhas()を使用します。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); console.log(mapObj.has('name')); // true console.log(mapObj.has('username')); // false
要素の削除にはdelete()を使用します。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); // 要素の削除 mapObj.delete('id'); console.log(mapObj); // Map(1) {'name' => 'sophia'}
ループ処理にはfor…ofなどが使えます。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); // Mapのループ for (const [key, val] of mapObj) { console.log(key, ':', val); // name : sophia id : 214 }
すべての要素を取り除く場合はclear()を使用します。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); mapObj.clear(); console.log(mapObj); // Map(0) {size: 0}
Mapオブジェクトのコピーはnew Map()でできます。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ]); // Mapの複製 const clone = new Map(mapObj); console.log(clone); // Map(2) {'name' => 'sophia', 'id' => 214} mapObj.set('name', 'nozomi'); clone.set('id', 519); console.log(mapObj); // Map(2) {'name' => 'nozomi', 'id' => 214} console.log(clone); // Map(2) {'name' => 'sophia', 'id' => 519}
コピー元やコピー先のMapオブジェクトを変更しても、もう一方のMapオブジェクトは変更されません。
Mapオブジェクトの複製のデモページ
複数のMapや配列の混合もnew Map()で行えます。
const mapObj = new Map([ ['name', 'sophia'], ['id', 214], ['user', 'SophiaV214'] ]); const mapObj2 = new Map([ ['name', 'meruto'], ['id', 519], ]); // Mapの混合 const merged = new Map([...mapObj, ...mapObj2, ['name', 'nozomi']]); console.log(merged); // Map(3) {'name' => 'nozomi', 'id' => 519, 'user' => 'SophiaV214'}
スプレッド演算子を使って2次元配列に変換して、new Map()に設定しています。
Mapオブジェクトの混合のデモページ
コメントが承認されるまで時間がかかります。