ES 6ノート-セットとMapデータ構造
7100 ワード
阮一峰ES 6教程によって摘出される可能性のある特性
セットデータ構造
配列に似ていますが、メンバー値はすべて唯一で、new set()によって作成されます.
属性 操作方法
Setの巡回順序は挿入順序です. Setはキー名がないので、keys()とvalues()の方法は同じです. を指定しても良い.
配列
Setに似ていますが、メンバーはオブジェクトだけです. 弱アプリケーション、メモリリークリスクなし アクセス属性がないが、add、delete、hasメソッドがあります.
Mapデータ構造
ES 5のオブジェクトは文字列のみをキーとし、Map構造は各種類の値(オブジェクトを含む)をキーとし、MapはObjectよりも適切です. mapのキーは実際にメモリアドレスと紐付けられています.値とは関係ありません.
操作方法
set(key,value)は現在のmapオブジェクトに戻り、チェーンで書くことができます.
巡回順序は挿入順序です.
配列mapと結合して、filter方法はMapのエルゴードとフィルタリングを実現します.
Mapを行列に変換
Mapに似ていますが、キーはオブジェクトのみとなります. WeakMapのキーが指す対象はゴミ回収機構に計上しない(メモリ漏れなし)
操作を巡回していませんが、set、get、has、deleteの方法があります.
適用
私たちはこの状態をキーとしてWeakMapに置き、対応するキー名は
セットデータ構造
配列に似ていますが、メンバー値はすべて唯一で、new set()によって作成されます.
属性
Set.prototype.constructor
:コンストラクタ、デフォルトはSet
関数です.Set.prototype.size
:Set
の例のメンバの総数を返します.add(value)
:ある値を追加して、Set構造自体に戻る.delete(value)
:ある値を削除し、ブール値を返し、削除が成功したかどうかを示す.has(value)
は、Set
のメンバであるかどうかを示すブール値を返します.clear()
:全員をクリアし、戻り値がない.let s = new Set()
s.add(1).add(2).add(2);
// 2
s.size // 2
s.has(1) // true
s.has(2) // true
s.has(3) // false
s.delete(2);
s.has(2) // false
巡回方法Setの巡回順序は挿入順序です. Setはキー名がないので、keys()とvalues()の方法は同じです.
keys()
:キーパッドに戻るエルゴードvalues()
:キー値を返すエルゴードentries()
:キーパッドペアに戻るエルゴードforEach()
:コールバック関数を使用して、各メンバを巡回しても良いし、第二のパラメータを使用して、thisオブジェクトlet set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
set = new Set([1,4,9]);
set.forEach((value,key) => console.log(`${key}:${value}`))
//1:1
//4:4
//9:9
アプリケーションを巡回配列
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
// [3, 5, 2]
間接的にmap、filterの方法を使います.let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// Set :{2, 4, 6}
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
// Set :{2, 4}
集合、交差、差集合を実現する.let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
//
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
//
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
//
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
ウェストセットSetに似ていますが、メンバーはオブジェクトだけです. 弱アプリケーション、メモリリークリスクなし アクセス属性がないが、add、delete、hasメソッドがあります.
Mapデータ構造
ES 5のオブジェクトは文字列のみをキーとし、Map構造は各種類の値(オブジェクトを含む)をキーとし、MapはObjectよりも適切です. mapのキーは実際にメモリアドレスと紐付けられています.値とは関係ありません.
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"
属性size
属性は、Map構造のメンバー総数に戻る.操作方法
set(key,value)は現在のmapオブジェクトに戻り、チェーンで書くことができます.
const m = new Map();
m.set('edition', 6) //
m.set(262, 'standard') //
m.set(undefined, 'nah') // undefined
let map = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
キー(key)は、keyに対応するキーを得る.const m = new Map();
const hello = function() {console.log('hello');};
m.set(hello, 'Hello ES6!') //
m.get(hello) // Hello ES6!
has(key)キーはMapオブジェクトにありますか?const m = new Map();
m.set('edition', 6)
.set(262, 'standard')
.set(undefined, 'nah');
m.has('edition') // true
m.has('years') // false
m.has(262) // true
m.has(undefined) // true
delete(key)はあるキーを削除して、成功したらtrueに戻ります.失敗falseconst m = new Map();
m.set(undefined, 'nah');
m.has(undefined) // true
m.delete(undefined)
m.has(undefined) // false
clear()は全員をクリアし、戻り値なしlet map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size // 2
map.clear()
map.size // 0
巡回方法、巡回順序は挿入順序です.
keys()
:キーのエルゴードを返す.values()
:キーパッドのエルゴードを返す.entries()
:全メンバーのエルゴードを返す.forEach()
:Mapの全メンバーを巡回しました.const map = new Map([
['F', 'no'],
['T', 'yes'],
]);
for (let key of map.keys()) {
console.log(key);
}
// "F"
// "T"
for (let value of map.values()) {
console.log(value);
}
// "no"
// "yes"
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
//
for (let [key, value] of map.entries()) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
// map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
適用配列mapと結合して、filter方法はMapのエルゴードとフィルタリングを実現します.
const map0 = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
const map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
// Map {1 => 'a', 2 => 'b'}
const map2 = new Map(
[...map0].map(([k, v]) => [k * 2, '_' + v])
);
// Map {2 => '_a', 4 => '_b', 6 => '_c'}
forEachメソッドconst reporter = {
report: function(key, value) {
console.log("Key: %s, Value: %s", key, value);
}
};
map.forEach(function(value, key, map) {
this.report(key, value);
}, reporter);
データ構造間の相互変換Mapを行列に変換
const myMap = new Map()
.set(true, 7)
.set({foo: 3}, ['abc']);
[...myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
配列をMapに変換new Map([
[true, 7],
[{foo: 3}, ['abc']]
])
Mapをオブジェクトに変換function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v;
}
return obj;
}
const myMap = new Map()
.set('yes', true)
.set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }
オブジェクトをMapに変換function objToStrMap(obj) {
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
objToStrMap({yes: true, no: false})
// Map {"yes" => true, "no" => false}
WeakMapMapに似ていますが、キーはオブジェクトのみとなります. WeakMapのキーが指す対象はゴミ回収機構に計上しない(メモリ漏れなし)
操作を巡回していませんが、set、get、has、deleteの方法があります.
適用
私たちはこの状態をキーとしてWeakMapに置き、対応するキー名は
myElement
です.このDOMノードが削除されると、この状態は自動的に消え、メモリ漏れのリスクがない.let myElement = document.getElementById('logo');
let myWeakmap = new WeakMap();
myWeakmap.set(myElement, {timesClicked: 0});
myElement.addEventListener('click', function() {
let logoData = myWeakmap.get(myElement);
logoData.timesClicked++;
}, false);