JavaScriptの文法(マップとセット)
せっかくMap
、Set
が使えるのだからObject
を使うと決定する前に、Map
、Set
が使えないか?を考えるべき。
マップ(Map)
- オブジェクトの特徴(マップの違い)
- キーとして使用できるのは、
文字列
、シンボル
のみ。(オブジェクトをキーとすることができない) - キーと値の組がいくつあるか、簡単に分からない。
- プロトタイプがあるため、意図しないマッピングが生じる危険性がある。
- キーとして使用できるのは、
// 前処理 const u1 = {name:'Takeshi'}, u2 = {name:'Hanako'}, u3 = {name:'Daichi'}, u4 = {name:'Keiko'}; // マップ(Mapオブジェクト)の生成 const userRoles = new Map(); // メソッドsetを用いてユーザーと役割の対応付け userRoles.set(u1,'teacher') .set(u2,'student') .set(u3,'student'); // --------------------- // Mapの中身を確認する // --------------------- // get console.log(userRoles); // Map(3) {{…} => "teacher", {…} => "student", {…} => "student"} console.log(userRoles.get(u1)); // teacher console.log(userRoles.get(u2)); // student console.log(userRoles.get(u3)); // student console.log(userRoles.get(u4)); // undefined // has console.log(userRoles.has(u1)); // true console.log(userRoles.has(u2)); // true console.log(userRoles.has(u3)); // true console.log(userRoles.has(u4)); // false // set(上書き) console.log(userRoles.set(u3,'ob')); // Map(3) {{…} => "teacher", {…} => "student", {…} => "ob"} // sizeを取得する console.log(userRoles.size); // 3 // 要素に対しアクセスする for(let u of userRoles.keys()) console.log(u.name); // Takeshi // Hanako // Daichi for(let r of userRoles.values()) console.log(r); // teacher // student // ob for(let ur of userRoles.entries()) console.log(`${ur[0].name}: ${ur[1]}`); // Takeshi: teacher // Hanako: student // Daichi: ob for(let [u,r] of userRoles.entries()) console.log(`${u.name}: ${r}`); // Takeshi: teacher // Hanako: student // Daichi: ob for(let [u,r] of userRoles)// 「entries」はデフォルトイテレータ console.log(`${u.name}: ${r}`); // Takeshi: teacher // Hanako: student // Daichi: ob // Valueを抽出する console.log(userRoles.values()); // MapIterator {"teacher", "student", "ob"} console.log([...userRoles.values()]); // ["teacher", "student", "ob"] // マップから要素を削除する userRoles.delete(u2); console.log(userRoles.size); // 2 console.log(userRoles.values()); // MapIterator {"teacher", "ob"} console.log(userRoles); // Map(2) {{…} => "teacher", {…} => "ob"} // マップから全ての要素を削除する userRoles.clear(); console.log(userRoles.size); // 0 console.log(userRoles.values()); // MapIterator {} console.log(userRoles); // Map(0) {}
ウィークマップ(WeakMap)
- マップとの違い
- キーはオブジェクトでなければならない
- キーがガベージコレクションの対象になる
- イテレーション、クリアができない
セット(Set)
- 重複しない
// セット(Setオブジェクト)の生成 const roles = new Set(); // メソッドaddを用いてユーザーと役割の対応付け roles.add('teacher'); console.log(roles); // Set(1) {"teacher"} roles.add('student'); console.log(roles); // Set(2) {"teacher", "student"} // プロパティsizeを用いてサイズを確認する console.log(roles.size); // 2 // 既存の要素に重複する要素を追加する console.log(roles.add('student')); console.log(roles); // {"teacher", "student"} // 要素を削除する console.log(roles.delete('student')); // true console.log(roles.size); // 1 console.log(roles); // Set(1) {"teacher"} console.log(roles.delete('ob')); // false console.log(roles.size); // 1 console.log(roles); // Set(1) {"teacher"} console.log(roles.delete('teacher')); // true console.log(roles.size); // 0 console.log(roles); // Set(0) {}
ウィークセット(WeakSet)
- オブジェクトだけを含むことができる
Set
- ガベージコレクションの対象となる可能性がある