MapとSetのデータ構造

2697 ワード

Map
JsのObjectは、本質的にはキーパッドペアの集合であるが、文字列のみをkeyとして使用することができ、この問題を解決するために、ES 6でMapデータ構造を提供している.
mapは対象に似ていて、キーペアの集合でもありますが、keyは文字列だけではなく、各種類の値(対象を含む)を構築することができます.
Objectは「文字列ー値」の対応であり、Mapは「値ー値」の対応であり、
const m = new Map();

const o = { p: 'hello world'};

m.set(o,'content')

m.get(o);//content

m.has(o)//true

m.delete(o)//true

m.has(o);//false
上にはset方式で一つのオブジェクトoをmの一つのキーとし、またgetでoの値を取ってからこのキーを削除します.
Mapはパラメータとして1つの配列をも受け入れることができます.この配列のメンバーはキーペアを示す配列です.
const map = new Map([

  ['name', '  '],

  ['title', 'Author']

]);

map.size // 2

map.has('name') // true

map.get('name') // "  "

map.has('title') // true

map.get('title') // "Author"
同じキーに複数の値を割り当てると、後の値が前の値を上書きします.未知のキーを読み出すとundefinedが返されます.
同じオブジェクトに対する参照のみが、Map構造は同じキーと見なされます.
var map = new Map();
//         ,         ,         
map.set(['a'], 555);
map.get(['a']) // undefined
同じ値の2つの例は、Map構造では2つのキーとして扱われる.
//  k1 k2      ,     Map         
var map = new Map(); 
var k1 = ['a'];
var k2 = ['a']; 
map
.set(k1, 111)
.set(k2, 222); 
map.get(k1) // 111
map.get(k2) // 222
上から分かりました.Mapのキーは実際にメモリアドレスと紐付けされています.メモリアドレスが違っていれば、2つのキーとして扱います.これは同名の属性衝突の問題を解決した.map.size属性はMap構造のメンバー総数set(key,value)メソッド設定key setメソッドに戻ります.Map自体ですので、チェーン式の書き方ができます.get方法は、keyに対応するキーの値を読み取り、keyが見つからなければundefinedに戻ります.has方法は、あるキーがMapデータ構造にあるかどうかを示すブール値を返します.deleteメソッドは、あるキーを削除して、trueに戻ります.削除に失敗したらfalseを返します.clearメソッドは、すべてのメンバーをクリアし、値を返しませんでした.Map原生は三つのエルゴード生成関数とエルゴード法を提供します.
keys():キーの名前を返すエルゴード.values():キーのエルゴードを返します.entries():全メンバーのエルゴードを返します.forEach():Mapの全メンバーを巡回しました.特に注意したいのは、Mapの遍歴順が挿入順です.
Map構造を配列構造に変換し、比較的速い方法は拡張演算子(…)の使用と組み合わせることである.
let map0 = new Map()
  .set(1, 'a')
  .set(2, 'b')
  .set(3, 'c');

let map1 = new Map(
  [...map0].filter(([k, v]) => k < 3)
);
//   Map   {1 => 'a', 2 => 'b'}

let map2 = new Map(
  [...map0].map(([k, v]) => [k * 2, '_' + v])
    );
//   Map   {2 => '_a', 4 => '_b', 6 => '_c'}
配列をMapに変換
new Map([[true, 7], [{foo: 3}, ['abc']]])
// Map {true => 7, Object {foo: 3} => ['abc']}
Mapをオブジェクトに変換
//    Map       ,       。
function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

let myMap = new Map().set('yes', true).set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }
セット