[解決済み] JavaScriptのNodeListをArrayに変換する最速の方法は?
2022-04-15 15:23:26
質問
過去に回答した質問では、この方法が一番早いと書いてありました。
//nl is a NodeList
var arr = Array.prototype.slice.call(nl);
私のブラウザでベンチマークをとったところ、この3倍以上遅いことが判明しました。
var arr = [];
for(var i = 0, n; n = nl[i]; ++i) arr.push(n);
どちらも同じ出力をしますが、私の2番目のバージョンが最速の方法であるとは信じがたく、特にここでそうではないと言われているためです。
これは私のブラウザ(Chromium 6)のクセなのでしょうか?それとも、もっと速い方法があるのでしょうか?
EDIT: 気になる人のために、私は以下に落ち着きました(私がテストしたすべてのブラウザで最速のようです)。
//nl is a NodeList
var l = []; // Will hold the array of Node's
for(var i = 0, ll = nl.length; i != ll; l.push(nl[i++]));
EDIT2: もっと早い方法を見つけました。
// nl is the nodelist
var arr = [];
for(var i = nl.length; i--; arr.unshift(nl[i]));
解決方法は?
2021年版を更新しました。 nodeList.forEach()が標準化されました。 で、現在のすべてのブラウザでサポートされています ( モバイルでは約95%。 ).
だから、単純にできるんです。
document.querySelectorAll('img').forEach(highlight);
その他の事例
何らかの理由で、単に反復処理するだけでなく、配列に変換したい場合 - これは完全に関連するユースケースです - は、次のようにします。
[...destructuring]
または
Array.from
ES6以降
let array1 = [...mySetOfElements];
// or
let array2 = Array.from(mySetOfElements);
これは、NodeList ではない他の配列のような構造でも動作します。
-
HTMLCollection
などで返されます。document.getElementsByTagName
- 長さプロパティとインデックス付き要素を持つオブジェクト
-
反復可能なオブジェクト(例えば
Map
とSet
)
2010年の古い回答
2番目のものは、一部のブラウザで高速化する傾向がありますが、1番目のものはクロスブラウザに対応していないため、使用する必要があるというのが大きなポイントです。たとえ、The Times They Are a-Changin'(時代と共に去りぬ)であっても。
カンガックス ( IE 9プレビュー )
Array.prototype.slice が変換できるようになりました。 特定のホストオブジェクト(例:NodeList's) を配列に変換します。 モダンブラウザでできるようになった を追加しました。
例
Array.prototype.slice.call(document.childNodes);
関連
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】module.exports "モジュールが定義されていません"
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー
-
[解決済み】javascriptの[].slice.callの説明?