Czy istnieje bardziej skuteczny sposób konwersji HTMLCollection na macierz, inny niż iteracja przez zawartość wspomnianej kolekcji i ręczne wpychanie każdego elementu do tablicy?
javascript
arrays
object
Tomek
źródło
źródło
for (var a=[], i=collection.length; i;) a[--i] = collection[i];
tak mało „Array.prototype.slice.call
a Brave (oparty na Chrome 59.0.3071) praktycznie nie ma różnicy między dwoma testami javascript w wielu uruchomieniach. Zobacz jsperf.com/htmlcollection-array-vs-jquery-childrenOdpowiedzi:
będzie miał ten sam efekt przy użyciu „natywnego” kodu.
Edytować
Ponieważ uzyskuje się wiele wyświetleń, zwróć uwagę (na komentarz @ oriol), że następujące bardziej zwięzłe wyrażenie jest faktycznie równoważne:
Zwróć jednak uwagę na komentarz @ JussiR, że w przeciwieństwie do formy „pełnej”, tworzy w tym procesie pustą, nieużywaną i rzeczywiście nieużywaną instancję tablicy. To, co robią kompilatory, jest poza zasięgiem programisty.
Edytować
Od ECMAScript 2015 (ES 6) istnieje również Array. Od :
Edytować
ECMAScript 2015 udostępnia również operator rozkładania , który jest funkcjonalnie równoważny
Array.from
(chociaż uwaga, któraArray.from
obsługuje funkcję odwzorowania jako drugi argument).Potwierdziłem, że obie powyższe prace działają
NodeList
.Porównanie wydajności wymienionych metod: http://jsben.ch/h2IFA
źródło
[].slice.call(htmlCollection)
również działa.Array.from
, tzn.from
nie jest obsługiwany przez IE11.nie jestem pewien, czy jest to najbardziej wydajny, ale zwięzła składnia ES6 może wyglądać tak:
Edycja: Kolejna, z komentarza Chris_F:
źródło
Array.from()
Array.from
, tzn.from
nie jest obsługiwany przez IE11.Widziałem bardziej zwięzłą metodę pozyskiwania
Array.prototype
metod, która działa równie dobrze. PrzekształcanieHTMLCollection
obiektu wArray
obiekt pokazano poniżej:I, jak wspomniano w komentarzach, w przypadku starszych przeglądarek, takich jak IE7 i wcześniejsze, wystarczy użyć funkcji zgodności, takiej jak:
Wiem, że to stare pytanie, ale czułem, że zaakceptowana odpowiedź była nieco niepełna; więc pomyślałem, że wyrzucę to FWIW.
źródło
W przypadku implementacji w różnych przeglądarkach sugeruję, abyś spojrzał na funkcję prototype.js
$A
skopiowane z 1.6.1 :
Prawdopodobnie nie używa,
Array.prototype.slice
ponieważ nie jest dostępny w każdej przeglądarce. Obawiam się, że wydajność jest dość zła, ponieważ istnieje odwrócenie pętli javascript naditerable
.źródło
$A
funkcja wykonuje większość czasu.To jest moje osobiste rozwiązanie, oparte na informacjach tutaj (ten wątek):
Gdzie $ A został opisany przez Garetha Davisa w jego poście:
Jeśli przeglądarka obsługuje najlepszy sposób, ok, w przeciwnym razie będzie korzystać z przeglądarki krzyżowej.
źródło
[,,]
dzieje[undefined, undefined]
.Działa to we wszystkich przeglądarkach, w tym we wcześniejszych wersjach IE.
Ponieważ jsperf jest obecnie niedostępny, oto jsfiddle, który porównuje wydajność różnych metod. https://jsfiddle.net/qw9qf48j/
źródło
var args = (htmlCollection.length === 1 ? [htmlCollection[0]] : Array.apply(null, htmlCollection));
Aby skutecznie przekonwertować tablicę na tablicę, możemy skorzystać z jQuery
makeArray
:Stosowanie:
Trochę więcej:
Jeśli nie chcesz zachować odwołania do obiektu tablicy (przez większość czasu HTMLCollections zmieniają się dynamicznie, więc lepiej skopiować je do innej tablicy, w tym przykładzie zwróć szczególną uwagę na wydajność:
Co to jest tablica?
HTMLCollection jest
"array-like"
przedmiotem, array-jak obiekty są podobne do obiektu Array, ale brakuje wiele jego definicji funkcjonalnym:źródło