ES 6のsetとmapを深く理解する.
12644 ワード
Set基本的な使い方ES 6は、新しいデータ構造Setを提供する.配列に似ていますが、メンバーの値は全部唯一で、重複した値はありません.Set自体はSetデータ構造を生成するためのコンストラクターである.
Set構造を巡回操作する例は、メンバーを巡回するために使用できる4つのエルゴード法がある.キーの名前を返すエルゴード():キーの値を返すエルゴード(61623):キーの値を返すエルゴード(61623):キーの値を返すエルゴード(61623):リターンの順番は挿入順です.Set構造にはキー名がなく、キー値(またはキー名とキー値が同じ値)しかないので、keys方法とvaluesメソッドの動作は完全に一致しています.entriesメソッドは、キーとキーの値を同時に含むエルゴードを返します.だから、各配列を出力します.その二つのメンバーは完全に同じです.Set構造の実例はデフォルトでは巡回可能で、デフォルトのエルゴード生成関数はそのvalues方法です.これは、values方法を省略してfor...ofサイクルをSetを巡回することができるという意味です.
Mapの意味と基本的な使い方はJavaScriptのオブジェクト(Object)で、本質的にはキーパッドのペアのセット(Hash構造)ですが、伝統的には文字列だけをキーとして使用することができます.これはその使用に大きな制限を与えた.ES 6は、Mapデータ構造を提供する.オブジェクトに似ていて、キーパッドのペアの集合でもありますが、キーの範囲は文字列に限られず、各種の値(オブジェクトを含む)はキーとして使用できます.つまり、Object構造は「文字列ー値」の対応を提供し、Map構造は「値ー値」の対応を提供し、より完璧なHash構造の実現である.もしあなたが「キーペア」のデータ構造が必要ならば、MapはObjectよりもっと適しています.例の属性および動作方法Map構造の例は、以下の属性および動作方法である.(1)size属性size属性は、Map構造のメンバー総数を返します.(2)set(key,value)setメソッドは、キーキーキーキーに対応するキー値をvalueとして設定し、Map構造全体に戻る.キーの値がすでにあると、キーの値が更新されます.そうでないと新しいキーが生成されます.3)get(key)get方法は、keyに対応するキーの値を読み取り、keyが見つからなければundefinedに戻る.(4)has(key)has方法はブール値を返し、あるキーが現在のMapオブジェクトの中にあるかどうかを示します.(5)delete(key)delete方法は、あるキーを削除して、trueに戻ります.削除に失敗したらfalseを返します.(6)clear()clear方法は、全員をクリアし、戻り値がない.エルゴード法Map構造原生は三つのエルゴード生成関数とエルゴード法を提供する.キーの名前を返すエルゴード.キーのエルゴードを返します.entries():全メンバーのエルゴードを返します.forEach():Mapの全メンバーを遍歴しました.特に注意したいのは、Mapの遍歴順が挿入順です.Map構造を配列構造に変換し、比較的速い方法は拡張演算子(…)を使用することである.配列のmap方法、filter方法を組み合わせて、Mapのエルゴードとフィルタリング(Map自体はmapとfilter方法がない)を実現することができます.他のデータ構造との相互変換(1)Mapをオブジェクトに変換します.すべてのMapのキーが文字列であれば、それは無傷でオブジェクトに変換できます.文字列以外のキー名があると、このキー名は文字列に変換され、対象のキー名となります.
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);}
// 2 3 5 4
上のコードはadd法によりSet構造にメンバーを追加したが、Set構造は重複した値を追加しないことを示した.Set関数は、パラメータとして1つの配列(または、iterableインターフェースを有する他のデータ構造)を受け入れ、初期化することができる. const set = new Set([1, 2, 3, 4, 4]);
上のコードはまた、配列繰返しメンバを除去する方法を示している.Setの例の属性および方法Set構造の例には、以下のような属性がある. Set.prototype.constructor: , Set 。
Set.prototype.size: Set 。
Setの例の方法は、2つの大きなクラスに分けられている.操作方法(データを操作するための)と、メンバを巡回するためのエルゴード方法.まず四つの操作方法を紹介します.add:ある値を追加して、Set構造自体に戻ります.delete:ある値を削除し、ブール値を返します.削除が成功したかどうかを表します.has:Setのメンバーであるかどうかを示すブール値を返します.clear():全メンバーをクリアし、戻り値がない.Aray.from法はSet構造を配列に変えることができる.Set構造を巡回操作する例は、メンバーを巡回するために使用できる4つのエルゴード法がある.キーの名前を返すエルゴード():キーの値を返すエルゴード(61623):キーの値を返すエルゴード(61623):キーの値を返すエルゴード(61623):リターンの順番は挿入順です.Set構造にはキー名がなく、キー値(またはキー名とキー値が同じ値)しかないので、keys方法とvaluesメソッドの動作は完全に一致しています.entriesメソッドは、キーとキーの値を同時に含むエルゴードを返します.だから、各配列を出力します.その二つのメンバーは完全に同じです.Set構造の実例はデフォルトでは巡回可能で、デフォルトのエルゴード生成関数はそのvalues方法です.これは、values方法を省略してfor...ofサイクルをSetを巡回することができるという意味です.
Mapの意味と基本的な使い方はJavaScriptのオブジェクト(Object)で、本質的にはキーパッドのペアのセット(Hash構造)ですが、伝統的には文字列だけをキーとして使用することができます.これはその使用に大きな制限を与えた.ES 6は、Mapデータ構造を提供する.オブジェクトに似ていて、キーパッドのペアの集合でもありますが、キーの範囲は文字列に限られず、各種の値(オブジェクトを含む)はキーとして使用できます.つまり、Object構造は「文字列ー値」の対応を提供し、Map構造は「値ー値」の対応を提供し、より完璧なHash構造の実現である.もしあなたが「キーペア」のデータ構造が必要ならば、MapはObjectよりもっと適しています.例の属性および動作方法Map構造の例は、以下の属性および動作方法である.(1)size属性size属性は、Map構造のメンバー総数を返します.(2)set(key,value)setメソッドは、キーキーキーキーに対応するキー値をvalueとして設定し、Map構造全体に戻る.キーの値がすでにあると、キーの値が更新されます.そうでないと新しいキーが生成されます.3)get(key)get方法は、keyに対応するキーの値を読み取り、keyが見つからなければundefinedに戻る.(4)has(key)has方法はブール値を返し、あるキーが現在のMapオブジェクトの中にあるかどうかを示します.(5)delete(key)delete方法は、あるキーを削除して、trueに戻ります.削除に失敗したらfalseを返します.(6)clear()clear方法は、全員をクリアし、戻り値がない.エルゴード法Map構造原生は三つのエルゴード生成関数とエルゴード法を提供する.キーの名前を返すエルゴード.キーのエルゴードを返します.entries():全メンバーのエルゴードを返します.forEach():Mapの全メンバーを遍歴しました.特に注意したいのは、Mapの遍歴順が挿入順です.Map構造を配列構造に変換し、比較的速い方法は拡張演算子(…)を使用することである.配列のmap方法、filter方法を組み合わせて、Mapのエルゴードとフィルタリング(Map自体はmapとfilter方法がない)を実現することができます.他のデータ構造との相互変換(1)Mapをオブジェクトに変換します.すべての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 }
(2)オブジェクトをMapに変換function objToStrMap(obj) {
let strMap = new Map();
for (let k in Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;}
objToStrMap({yes: true, no: false})
// Map {"yes" => true, "no" => false}
(3)MapがJSON Mapに変わりJSONになる場合は、2つの状況を区別します.一つは、Mapのキー名が文字列である場合、対象となるJSONを選択することができます.unction strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));}
let myMap = new Map().set('yes', true).set('no', false);strMapToJson(myMap)
// '{"yes":true,"no":false}'
(4)JSONがMap JSONに転じてMapになります.正常な場合、すべてのキー名は文字列です.unction jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr));}
jsonToStrMap('{"yes": true, "no": false}')
// Map {'yes' => true, 'no' => false}
Iterator(エルゴード)の概念JavaScriptはもともと「集合」を表すデータ構造であり、主に配列とオブジェクト(Object)であり、ES 6はまたMapとSetを追加した.このように4つのデータセットがあり、ユーザーはさらにそれらを組み合わせて使用して、配列のメンバーがMapであり、Mapのメンバーがオブジェクトであるなど、自分のデータ構造を定義してもよい.このように、すべての異なるデータ構造を処理するために、統一したインターフェース機構が必要となる.エルゴード(Iterator)はこのような仕組みです.これは様々な異なるデータ構造のための統一的なアクセス機構を提供するインターフェースである.任意のデータ構造は、Iteratorインターフェースを配置するだけで、巡回動作(すなわち、データ構造の全メンバを順次処理する)を完了することができる.Iteratorの役割は三つあります.一つは各種データ構造のために、統一的で簡便なアクセスインターフェースを提供します.第二は、データ構造のメンバーをある順序で並べられるようにすることである.第三はES 6が作成した新しいエルゴード命令for...ofサイクル、Iteratorインターフェースは主にfor...of消費に供給されます.Iteratorの遍歴過程はこうです.(1)ポインタオブジェクトを作成し、現在のデータ構造の開始位置を指します.つまり、エルゴードオブジェクトは本質的に、ポインタオブジェクトです.(2)ポインタオブジェクトのnextメソッドを初めて呼び出すと、ポインタをデータ構造の最初のメンバに向けることができます.(3)ポインタオブジェクトのnextメソッドを2回目に呼び出すと、ポインタはデータ構造の2番目のメンバを指します.(4)ポインタオブジェクトのnextメソッドを呼び出し、データ構造の終了位置を指します.デフォルトのIteratorインターフェースIteratorインターフェースの目的は、すべてのデータ構造のための統一的なアクセスメカニズム、すなわちfor...ofサイクルを提供することである.for...ofサイクルを使ってあるデータ構造を巡回すると、このサイクルは自動的にIteratorインターフェースを探します.一つのデータ構造は、Iteratorインターフェースを展開する限り、このようなデータ構造を「エルゴード」と呼ぶ.ES 6は、デフォルトのIteratorインターフェースがデータ構造のSymbol.iterator属性に配置されていると規定しています.あるいは、一つのデータ構造はSymbol.iterator属性を持っていれば、「エルゴード」ES 6の一部のデータ構造はもともとIteratorインターフェースを備えています.これらのデータ構造はもともとSymbol.iterator属性を展開していますが、他のいくつかのデータ構造は対象などありません.Symbol.iterator属性が展開されているデータ構造は、エルゴードインターフェースと呼ばれる.原生がIteratorインタフェースを備えているデータ構造は以下の通りです. Array
Map
Set
String
TypedArray
arguments
NodeList