Programming Self-Study Notebook

勉強したことを忘れないように! 思い出せるように!!

JavaScriptの文法(マップとセット)

f:id:overworker:20200406080809j:plain:h250

せっかくMapSetが使えるのだからObjectを使うと決定する前に、MapSetが使えないか?を考えるべき。

マップ(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)

参考文献