MapとSetのデータ構造
2697 ワード
Map
JsのObjectは、本質的にはキーパッドペアの集合であるが、文字列のみをkeyとして使用することができ、この問題を解決するために、ES 6でMapデータ構造を提供している.
mapは対象に似ていて、キーペアの集合でもありますが、keyは文字列だけではなく、各種類の値(対象を含む)を構築することができます.
Objectは「文字列ー値」の対応であり、Mapは「値ー値」の対応であり、
Mapはパラメータとして1つの配列をも受け入れることができます.この配列のメンバーはキーペアを示す配列です.
同じオブジェクトに対する参照のみが、Map構造は同じキーと見なされます.
keys():キーの名前を返すエルゴード.values():キーのエルゴードを返します.entries():全メンバーのエルゴードを返します.forEach():Mapの全メンバーを巡回しました.特に注意したいのは、Mapの遍歴順が挿入順です.
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 }
セット