Map のコンストラクタ
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 2
◆ 二次元配列を Map のコンストラクタに渡すと Map に変換される
◆ オブジェクトを渡してもいまのところエラー
◆ Object.prototype[Symbol.iterator] を自作すると動くようにできる
◆ オブジェクトを渡してもいまのところエラー
◆ Object.prototype[Symbol.iterator] を自作すると動くようにできる
Set のコンストラクタに配列を入れると Set に変換してくれました
(↑の関連を参照です)
じゃあ Map でもできるの?と試してみます
配列
new Map([1,2,3])
Uncaught TypeError: Iterator value 1 is not an entry object(…)
Uncaught TypeError: Iterator value 1 is not an entry object(…)
エラーがでています
無理なのかなぁ
と思ったのですが よく考えると Map では key と value のペアを登録するはずです
new Map([[1,2],[3,4]])
// Map {1 => 2, 3 => 4}
これでいけないかな とやってみたら Map に変換ができました// Map {1 => 2, 3 => 4}
二次元配列を渡すと良さそうです
new Map([[[1,2,3], {a:1,b:2}],["key", "value", "???"]])
// Map {[1, 2, 3] => Object {a: 1, b: 2}, "key" => "value"}
// Map {[1, 2, 3] => Object {a: 1, b: 2}, "key" => "value"}
内側の配列が 3 つ以上の要素数でも 最初の 2 つが使われるだけでエラーにはならないようです
3 次元以上の配列や オブジェクトになっていても key や value が配列やオブジェクトになるだけで 問題なく使えました
オブジェクト
考えてみると配列じゃなくてオブジェクト渡せばもっと楽では?と思ったのでオブジェクトnew Map({a:1})
Uncaught TypeError: Map is not a function(…)
Uncaught TypeError: Map is not a function(…)
エラーだ
ここのと同じで iterator の問題のような気がします
ということで
Object.prototype[Symbol.iterator] = function*(){
for(var k in this)
if(this.hasOwnProperty(k))
yield [k, this[k]]
}
for(var k in this)
if(this.hasOwnProperty(k))
yield [k, this[k]]
}
こんなのを準備
もう一回やってみると
new Map({a:1})
// Map {"a" => 1}
// Map {"a" => 1}
できた!!!!
Symbol.iterator のところは Chrome の実装待ちですね
それまではとりあえず↑のコードをいれておくとよさそうです