イテレータを配列にする
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ Array.from と [...] が便利すぎた
◆ Map や Set などはそれ自体を↑にいれて配列化できる
◆ Map や Set などはそれ自体を↑にいれて配列化できる
ジェネレータとか keys メソッドなどのイテレータを配列化したいときに自分で for of する必要はなかったんです
Array.from や [...] で配列化してくれます
注意しないといけないのは
終わらないイテレータを配列化しないように注意です
ところで Map や Set はそれ自体を配列変換できます
Set の場合は values か keys メソッドを配列化したのと一緒です
Set はキーとバリューが同じ Map ともいえるので keys でも values でも同じものが取得できます
entries だと key value の配列が返って来ますが 1 つめと 2 つめの要素が一緒の配列です
Weak 版の Map や Set には一覧取得する機能はないので配列化もできません
var a = new Map()
a.set("a", "abc")
a.set("b", "bcd")
a.set("c", "cde")
a.set("d", "def")
var it = a.keys()
Array.from(it)
// ["a", "b", "c", "d"]
[...a.keys()]
// ["a", "b", "c", "d"]
a.set("a", "abc")
a.set("b", "bcd")
a.set("c", "cde")
a.set("d", "def")
var it = a.keys()
Array.from(it)
// ["a", "b", "c", "d"]
[...a.keys()]
// ["a", "b", "c", "d"]
Array.from(function*(){
for(var i=0;i<10;i++){
if(i&1) yield i
}
}())
// [1, 3, 5, 7, 9]
for(var i=0;i<10;i++){
if(i&1) yield i
}
}())
// [1, 3, 5, 7, 9]
Array.from や [...] で配列化してくれます
注意しないといけないのは
var loopit = function*(){while(true) yield}
Array.from(loopit)
こういう無限ループするやつですArray.from(loopit)
終わらないイテレータを配列化しないように注意です
ところで Map や Set はそれ自体を配列変換できます
var s = new Set()
s.add(1)
s.add(2)
console.log([...s])
// [1, 2]
var m = new Map()
m.set(1, 2)
m.set(2, 4)
console.log([...m])
// [Array[2], Array[2]]
Map の場合は entries メソッドを配列化したのと一緒ですs.add(1)
s.add(2)
console.log([...s])
// [1, 2]
var m = new Map()
m.set(1, 2)
m.set(2, 4)
console.log([...m])
// [Array[2], Array[2]]
Set の場合は values か keys メソッドを配列化したのと一緒です
Set はキーとバリューが同じ Map ともいえるので keys でも values でも同じものが取得できます
entries だと key value の配列が返って来ますが 1 つめと 2 つめの要素が一緒の配列です
Weak 版の Map や Set には一覧取得する機能はないので配列化もできません