HTMLCollectionを配列に変換するためのより効率的な方法はありますか?
var arr = Array.prototype.slice.call( htmlCollection )
「ネイティブ」コードを使用しても同じ効果があります。
編集
これは多くのビューを取得するため、次のより簡潔な式は効果的に同等であることに注意してください(@oriolのコメントによる)。
var arr = [].slice.call(htmlCollection);
しかし、@ JussiRのコメントごとに注意してください。「冗長」フォームとは異なり、プロセス内で空の未使用の配列インスタンスを作成します。これについてコンパイラーが行うことは、プログラマーの範囲外です。
編集
ECMAScript 2015(ed 6)以降 Array.from もあります:
var arr = Array.from(htmlCollection);
編集
ECMAScript 2015は、 スプレッド演算子 も提供します。これは、機能的にはArray.from
と同等です(ただし、Array.from
は2番目の引数としてマッピング関数をサポートします)。
var arr = [...htmlCollection];
上記の両方がNodeList
で機能することを確認しました。
これが最も効率的かどうかはわかりませんが、簡潔なES6構文は次のようになります。
let arry = [...htmlCollection]
編集:別のもの、Chris_Fコメントから:
let arry = Array.from(htmlCollection)
一般にArray.prototype
メソッドを取得する、より簡潔な方法を見つけました。 HTMLCollection
オブジェクトをArray
オブジェクトに変換する方法を以下に示します。
[]。slice.call(yourHTMLCollectionObject);
そして、コメントで述べたように、IE7以前のような古いブラウザの場合次のような互換機能を使用するだけです。
function toArray(x) {
for(var i = 0, a = []; i < x.length; i++)
a.Push(x[i]);
return a
}
これは古い質問ですが、受け入れられた答えは少し不完全だと感じました。だから私はこれをFWIWに放り出すと思った。
クロスブラウザの実装については、 prototype.js$A
functionをご覧ください。
function $A(iterable) {
if (!iterable) return [];
if ('toArray' in Object(iterable)) return iterable.toArray();
var length = iterable.length || 0, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}
おそらくすべてのブラウザで利用できるわけではないため、Array.prototype.slice
を使用しません。フォールバックはiterable
のjavascriptループであるため、パフォーマンスがかなり悪いのではないかと心配しています。
これは、ここの情報(このスレッド)に基づく私の個人的な解決策です。
var Divs = new Array();
var Elemns = document.getElementsByClassName("divisao");
try {
Divs = Elemns.prototype.slice.call(Elemns);
} catch(e) {
Divs = $A(Elemns);
}
$ AがGareth Davisの投稿で説明された場所:
function $A(iterable) {
if (!iterable) return [];
if ('toArray' in Object(iterable)) return iterable.toArray();
var length = iterable.length || 0, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}
ブラウザが最適な方法をサポートしている場合は、OK、そうでない場合はクロスブラウザを使用します。
これは、以前のIEバージョンを含むすべてのブラウザーで機能します。
var arr = [];
[].Push.apply(arr, htmlCollection);
Jsperfは現在まだダウンしているため、異なるメソッドのパフォーマンスを比較するjsfiddleを示します。 https://jsfiddle.net/qw9qf48j/
配列のようなものを効率的な方法で配列に変換するには、 jQuerymakeArray
を使用します。
makeArray:配列のようなオブジェクトを真のJavaScript配列に変換します。
使用法:
var domArray = jQuery.makeArray(htmlCollection);
少し余分:
配列オブジェクトへの参照を保持したくない場合(ほとんどの場合、HTMLCollectionsは動的に変更されるため、別の配列にコピーする方が良いでしょう。この例では、パフォーマンスに細心の注意を払っています。
var domDataLength = domData.length //Better performance, no need to calculate every iteration the domArray length
var resultArray = new Array(domDataLength) // Since we know the length its improves the performance to declare the result array from the beginning.
for (var i = 0 ; i < domDataLength ; i++) {
resultArray[i] = domArray[i]; //Since we already declared the resultArray we can not make use of the more expensive Push method.
}
配列のようなものは何ですか?
HTMLCollection は"array-like"
オブジェクトです。 array-like オブジェクトは配列のオブジェクトに似ていますが、その機能的な定義の多くが欠落しています。
配列のようなオブジェクトは配列のように見えます。さまざまな番号の要素と長さプロパティがあります。しかし、それは類似性が止まるところです。配列のようなオブジェクトには配列の機能はなく、for-inループも機能しません!