ES6でノードリストをフィルタリングまたはマップする最も効率的な方法は何ですか?
私の読書に基づいて、私は次のオプションのいずれかを使用します:
[...nodelist].filter
または
Array.from(nodelist).filter
どちらをお勧めしますか?そして、たとえば配列を使用せずに、より良い方法はありますか?
ES6でノードリストをフィルタリングまたはマップする最も効率的な方法は何ですか?
私の読書に基づいて、私は次のオプションのいずれかを使用します:
[...nodelist].filter
または
Array.from(nodelist).filter
どちらをお勧めしますか?そして、たとえば配列を使用せずに、より良い方法はありますか?
...
構文はArray.from()
通常の方法ですが、古いIDEではサポートされていない可能性があります。
回答:
[...nodelist]
オブジェクトが反復可能である場合、オブジェクトから配列を作成します。Array.from(nodelist)
オブジェクトが反復可能である場合、またはオブジェクトが配列に似ている場合(has.length
およびnumeric props)、オブジェクトから配列を作成しますNodeList.prototype[Symbol.iterator]
どちらの場合も反復可能であるため、2つの例が存在する場合は同じになります。NodeList
ただし、環境が反復可能なように構成されていない場合、最初の例は失敗し、2番目の例は成功します。Babel
現在、このケースを適切に処理していません。
したがって、NodeList
反復可能である場合、使用するのは本当にあなた次第です。私はおそらくケースバイケースで選ぶでしょう。利点の1つArray.from
は、マッピング関数の2番目の引数を取るのに対し、最初の引数は[...iterable].map(item => item)
一時配列を作成するArray.from(iterable, item => item)
必要があることです。ただし、リストをマッピングしていない場合は問題ありません。
TL; DR;
Array.prototype.slice.call(nodelist).filter
スライス()メソッドは配列を返します。返される配列は、コレクション(NodeListの)の浅いコピーがあること
、それはより速く動作しますのでArray.from()
、それは限り速く動作しますので)(Array.from
元のコレクションの要素は、次のように返された配列にコピーされます。
議論に関する簡単な説明
Array.prototype.slice(beginIndex、endIndex)
Array.prototype.slice.call(namespace、beginIndex、endIndex)
Array.from
はないかと思います。IEマシンを見つける時が来ました。IE10とIE11でArray.fromを使用できたので、今は本当に混乱しています:\。このメソッドはIE10 + 11で機能しますが、すべてのドキュメントに別段の記載がある場合、Array.fromが機能するのは簡単ではありません。
Array.from
IE11の中に私のために動作しませんオブジェクト「から」プロパティまたはメソッドをサポートしていません
Array.from
また、浅いコピーを返します。ですから、それがより速く動作するとあなたがどのように結論付けるのかわかりませんArray#slice
。
これはどう:
// Be evil. Extend the prototype.
if (window.NodeList && !NodeList.prototype.filter) {
NodeList.prototype.filter = Array.prototype.filter;
}
// Use it like you'd expect:
const noClasses = document
.querySelectorAll('div')
.filter(div => div.classList.length === 0)
これは、NodeList.forEachのMDNドキュメント(「Polyfill」の下)に記載されているのと同じアプローチであり、IE11、Edge、Chrome、およびFFで機能します。
babel
、ではないものを[...coll]
要求するだけです。Array.from(coll)
Array