配列風オブジェクトから Array
インスタンスを生成します。
const nodeList = document.querySelectorAll('.target'); const arr = Array.from(nodeList); console.log(arr);
利用可能なのは以下の2種類です。
- 配列風オブジェクト
- 反復可能なオブジェクト
あと第2引数に関数を受け付けて、 map()
みたいなマッピングが可能です。
配列風オブジェクト
length
を持ってて [0]
, [1]
, [2]
, … で要素にアクセスできるやつ。
const arrayLike = { 0: 11, 1: 22, 2: 33, length: 3, }; const arr = Array.from(arrayLike); console.log(arr); // => [ 11, 22, 33 ]
反復可能なオブジェクト
反復可能とは、ざっくり言うと for-of
で使えるiterableなやつ。正確なところは別の記事に分けます。
配列
実は配列自体も反復可能なのです。特別扱いされているんじゃなくて、そういう共通処理が使える。
なおshallow copyなので、要素は同じです。
const arr0 = [ { value: 11 }, { value: 22 }, { value: 33 }, ]; const arr1 = Array.from(arr0); console.log(arr0 === arr1); // => false console.log(arr0[0] === arr1[0]); // => true
Map
, Map
こいつらも反復可能なので使えます。
const set = new Set(); set.add(11); set.add(22); set.add(11); // 重複 set.add(33); const arr = Array.from(set); console.log(arr); // => [ 11, 22, 33 ]
文字列
配列風オブジェクトの範疇ですが、実は本当に反復可能なオブジェクトです。
const arr = Array.from('Hello World!'); console.log(arr); // => [ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' ]
NodeList
DOMのやつ。反復可能です。
const els = document.querySelectorAll('.target'); const arr = Array.from(els); console.log(arr);
HTMLCollection
?
document.links
みたいなやつらもそうっぽい。
const els = document.getElementsByClassName('foo'); const arr = Array.from(els); console.log(arr);
Chrome, Firefox, Edgeでは動いたんだけど、これどこの仕様かわからない……。
jQuery
ところでjQueryもiterableなんですね。私、知らなかったわ。
というわけで使えます。
マッピング
第2引数に関数を受け付けて、マッピングしながら作成できます。
const nodeList = document.querySelectorAll('input[type=text]'); const textList = Array.from(nodeList, (el) => el.value); console.log(textList);
任意の数の配列を作る
MDNに載ってたやり方。配列風オブジェクトの応用でやれます。
const arr = Array.from({ length: 3 }); console.log(arr); // => [ undefined, undefined, undefined ] console.log(arr.length); // => 3
new Array(3)
↓と違い、ちゃんと undefined
が設定されていることに注目してください。
const arr = Array(3); console.log(arr); // => [ <3 empty items> ] console.log(arr.length); // => 3
マッピングと組み合わせて初期値を設定するのも良さそう。
const arr = Array.from({ length: 3 }, (_, i) => i); console.log(arr); // => [ 0, 1, 2 ]
その他
継承
Array.of()
↓もそうだったんだけど、 Array.from()
の方も継承したコンストラクターから利用かのうなよう設計されています。
おしまい
スプレッド構文 ...
の方が楽な気がする。
これは反復可能であれば使えます。配列風はだめなので、今回の Array.from()
で。
関連
参考
- Array.from() – JavaScript | MDN
- jQuery 3.0 and jQuery Compat 3.0 Alpha Versions Released | Official jQuery Blog … iterable対応を含むリリース。2015年
- ECMAScript® 2018 Language Specification
- DOM Standard (Last Updated 29 October 2018)
- 4.2.10.1. Interface NodeList …
iterable<Node>
という定義がある - 4.2.10.2. Interface HTMLCollection …
iterable<Node>
という定義がない
- 4.2.10.1. Interface NodeList …
- WebIDL Level 1