ES 6 Map追加
57950 ワード
Map
(1)基本文法
javascriptの対象(Object)は本質的にキーのセットで、文字列をキー名とするしかないです.他のタイプに対しては、自動的に文字列に変換されます.
Mapコンストラクタ
任意のIteratorインターフェースを持ち、各メンバーは二重要素配列のデータ構造をMapコンストラクタのパラメータとして扱うことができます.たとえば配列:
Mapのキーはメモリアドレスと紐付けされています.
(2)例示的な属性と操作方法
1.size属性
size属性は、Map構造のメンバー総数を返します.
セット方法はキー名に対応するキー値を設定し、Map構造に戻ります.設定したキーに値があるとキー値が更新されます.set方式では現在のMapオブジェクトを返すので、チェーン式で書くことができます.
get方法は、keyに対応するキーの値を読み取り、keyが見つからなければundefinedに戻ります.
4.has(key)
has方法は、Mapにキーがあるかどうかを示すブール値を返します.
5.delete(key)
deleteメソッドは、あるキーを削除して、trueに戻ります.削除に失敗したらfalseを返します.
6.clear()
clearメソッドは、すべてのメンバーをクリアし、値を返しませんでした.
(3)エルゴード方法
Mapの巡回順序は挿入順序です.
1.keys():キーの名前を返すエルゴード.
2.values():キーのエルゴードを返します.
3.entries():全メンバーのエルゴードを返します.
Map構造を行列に変換
Map構造から配列構造への比較的速い方法は拡張演算子(…)を結合することである.
Map自体にはmapとfilterの方法はありませんが、配列のmap方法、filter方法を組み合わせることで、Mapのエルゴードとフィルタリングが可能です.
MapのforEach法は配列のforEach法と類似しており,エルゴードを実現できる.
1.Mapを配列に変換
Mapを行列に変換する一番便利な方法は、拡張演算子を使うことです.
配列を配置関数に入力するとMapに変換できます.
配列のメンバーは二重要素配列です.
Mapのすべてのキーが文字列である場合、オブジェクトに変換できます.
Mapのキー名はすべて文字列です.
Mapを対象に変換し、JSON.strigify()を呼び出してオブジェクトJSONに変換します.
Mapを配列に変換し、JSON.strigifyを呼び出して配列JSONに変換します.
対象のJSON(すべてのキー名は文字列)からMap:
JSON.parse()を呼び出して対象JSON(すべてのキーは文字列)を対象にし、その後対象をMapにします.
JSON.parse()を呼び出して、配列JSONを配列に変え、その後、配列をMapの構造関数に導入する.
(1)基本文法
javascriptの対象(Object)は本質的にキーのセットで、文字列をキー名とするしかないです.他のタイプに対しては、自動的に文字列に変換されます.
let array_ = [1, 2, 3, 4];//
let function_ = function () {};//
let number_=123;//
let object_={};//
let a = {};
a[number_]="q";
a[array_]="qe";
a[function_]="qwe";
a[object_]="qwer";
let p = Object.keys(a);
console.log(p);//["123","1,2,3,4","function(){}","[object object]"]
console.log(typeof p[0]);//string
console.log(typeof p[1]);//string
console.log(typeof p[2]);//string
console.log(typeof p[3]);//string
この問題を解決するためにES 6はMapデータ構造を提供しています.これは類似のオブジェクトであり、キーパッドのペアのセットでもありますが、キーパッドの名前は様々なタイプであることができます. let number_=123;//
let array_ = [1, 2, 3, 4];//
let function_ = function () {};//
let object_={};//
const a=new Map();
a.set(number_,"q");
a.set(array_,"qw");
a.set(function_ ,"qwe");
a.set(object_,"qwer");
a.get(number_);//q
a.get(array_);//qw
a.get(function_);//qwe
a.get(object_);//qwer
for(let key of a.keys()){
console.log(typeof key);
}
//number
//object
//function
//object
Map構造のgetとset操作方法を使用しました.Mapコンストラクタ
任意のIteratorインターフェースを持ち、各メンバーは二重要素配列のデータ構造をMapコンストラクタのパラメータとして扱うことができます.たとえば配列:
const map = new Map([
[1,"one"],
[2, "two"],
[3, "three"]
]);
// Map{
// 1 => "one",
// 2 => "two",
// 3 => "three"
// }
入力された配列メンバーが3つの要素の配列を持っている場合、3番目の要素は無視されます.const map = new Map([
[1,"one","_one"],
[2, "two"],
[3, "three"]
]);
// Map{
// 1 => "one",
// 2 => "two",
// 3 => "three"
// }
配列のメンバーには単一要素配列があります. const map = new Map([
[1],
[2, "two"],
[3, "three"]
]);
// Map{
// 1 => undefined,
// 2 => "two",
// 3 => "three"
// }
配列に加えて、MapとSetは、新しいMapを生成するために使用されてもよい.Mapのキーはメモリアドレスと紐付けされています.
const map=new Map();
// k1 k2 , k1 k2
const k1=["a"];
const k2=["a"];
map.set(k1,111)
.set(k2,111);
map.get(k1);// 111
map.get(k2);// 222
Mapのキーはメモリアドレスと紐付けられています.二つの値のメモリアドレスが違っている限り、Mapはそれらを二つのキーとして扱います.(2)例示的な属性と操作方法
1.size属性
size属性は、Map構造のメンバー総数を返します.
let a=new Map();
a.set("1","q");
a.set("2","qw");
console.log(a.size)//2
2.set(key,value)セット方法はキー名に対応するキー値を設定し、Map構造に戻ります.設定したキーに値があるとキー値が更新されます.set方式では現在のMapオブジェクトを返すので、チェーン式で書くことができます.
let a=new Map();
a.set("1","q")
.set("2","qw")
.set("3","qwe");
3.get(key)get方法は、keyに対応するキーの値を読み取り、keyが見つからなければundefinedに戻ります.
4.has(key)
has方法は、Mapにキーがあるかどうかを示すブール値を返します.
5.delete(key)
deleteメソッドは、あるキーを削除して、trueに戻ります.削除に失敗したらfalseを返します.
6.clear()
clearメソッドは、すべてのメンバーをクリアし、値を返しませんでした.
(3)エルゴード方法
Mapの巡回順序は挿入順序です.
1.keys():キーの名前を返すエルゴード.
2.values():キーのエルゴードを返します.
3.entries():全メンバーのエルゴードを返します.
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構造のデフォルトのエルゴード属性インターフェース(Symbol.iteratorプロパティ)は、entries方法です.Map構造を行列に変換
Map構造から配列構造への比較的速い方法は拡張演算子(…)を結合することである.
const map = new Map([
["1", "one"],
["2", "two"],
["3", "three"]
]);
console.log([...map.keys()]);
//["1","2","3"]
console.log([...map.values()]);
//["one","two","three"]
console.log([...map.entries()]);
//[["1","one"],["2","two"],["3","three"]]
console.log([...map]);
//[["1","one"],["2","two"],["3","three"]]
MapのエルゴードとフィルタリングMap自体にはmapとfilterの方法はありませんが、配列のmap方法、filter方法を組み合わせることで、Mapのエルゴードとフィルタリングが可能です.
const map = new Map([
[1, "one"],
[2, "two"],
[3, "three"]
]);
const map1=new Map(
[...map].filter(([k,v])=>k<3)
);
// map {1=>"one",2=>"b"}
const map2=new Map(
[...map].map(([k,v])=>[k*2,"_"+v])
);
// map {2=>"_one",4=>"_two",6=>"_three"}
4.forEach():Mapの全メンバーを巡回します.MapのforEach法は配列のforEach法と類似しており,エルゴードを実現できる.
const map = new Map([
[1, "one"],
[2, "two"],
[3, "three"]
]);
map.forEach(function (value, key, map) {
console.log("Key:%s,Value:%s", key, value);
});
// Key:1,Value:one
// Key:2,Value:two
// Key:3,Value:three
forEach法はまた,結合thisのために第二のパラメータを受け入れることができる. const map = new Map([
[1, "one"],
[2, "two"],
[3, "three"]
]);
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);
// Key:1,Value:one
// Key:2,Value:two
// Key:3,Value:three
(4)他のデータ構造との転化1.Mapを配列に変換
Mapを行列に変換する一番便利な方法は、拡張演算子を使うことです.
const map = new Map([
["1", "one"],
["2", "two"],
["3", "three"]
]);
console.log([...map.keys()]);
//["1","2","3"]
console.log([...map.values()]);
//["one","two","three"]
console.log([...map.entries()]);
//[["1","one"],["2","two"],["3","three"]]
console.log([...map]);
//[["1","one"],["2","two"],["3","three"]]
2.配列をMapに変換配列を配置関数に入力するとMapに変換できます.
配列のメンバーは二重要素配列です.
const map = new Map([
[1,"one"],
[2, "two"],
[3, "three"]
]);
// Map{
// 1 => "one",
// 2 => "two",
// 3 => "three"
// }
配列のメンバーには単一要素配列があります. const map = new Map([
[1],
[2, "two"],
[3, "three"]
]);
// Map{
// 1 => undefined,
// 2 => "two",
// 3 => "three"
// }
配列のメンバーには3つの要素の配列があります. const map = new Map([
[1,"one","_one"],
[2, "two"],
[3, "three"]
]);
// Map{
// 1 => "one",
// 2 => "two",
// 3 => "three"
// }
3.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)
let a = strMapToObj(myMap);
console.log(a)
// { yes: true, no: false }
4.対象をMapに変換 function objToStrMap(obj) {
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
let a=objToStrMap({yes: true, no: false});
console.log(a)
// Map {"yes" => true, "no" => false}
5.MapをJSONに変換Mapのキー名はすべて文字列です.
Mapを対象に変換し、JSON.strigify()を呼び出してオブジェクトJSONに変換します.
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));
}
let myMap = new Map().set('yes', true).set('no', false);
strMapToJson(myMap)
// '{"yes":true,"no":false}'
Mapのキー名には文字列以外の文字列があります.Mapを配列に変換し、JSON.strigifyを呼び出して配列JSONに変換します.
function mapToArrayJson(map) {
return JSON.stringify([...map]);
}
let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
mapToArrayJson(myMap)
// '[[true,7],[{"foo":3},["abc"]]]'
6.JSONからMapに移行対象のJSON(すべてのキー名は文字列)からMap:
JSON.parse()を呼び出して対象JSON(すべてのキーは文字列)を対象にし、その後対象をMapにします.
function jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr));
}
jsonToStrMap('{"yes": true, "no": false}')
// Map {'yes' => true, 'no' => false}
配列JSON(各配列メンバー自体が2つのメンバーを持つ配列)は、Mapに変換される:JSON.parse()を呼び出して、配列JSONを配列に変え、その後、配列をMapの構造関数に導入する.
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
jsonToMap('[[true,7],[{"foo":3},["abc"]]]')
// Map {true => 7, Object {foo: 3} => ['abc']}
配列メンバーには3つの要素の配列があります.3番目の要素は無視されます.function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
jsonToMap('[[true,7,8],[{"foo":3},["abc"]]]')
// Map {true => 7, Object {foo: 3} => ['abc']}
配列メンバーは単一要素の配列があります.function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
jsonToMap('[[true],[{"foo":3},["abc"]]]')
// Map {true => undefined, Object {foo: 3} => ['abc']}
参考文献:『ECMAScript 6入門』阮一峰