Czy istnieje sposób na opróżnienie tablicy, a jeśli tak, to za pomocą .remove()
?
Na przykład,
A = [1,2,3,4];
Jak mogę to opróżnić?
javascript
arrays
akano1
źródło
źródło
Odpowiedzi:
Sposoby wyczyszczenia istniejącej tablicy
A
:Metoda 1
(to była moja pierwotna odpowiedź na pytanie)
Ten kod ustawi zmienną
A
na nową pustą tablicę. Jest to idealne rozwiązanie, jeśli nigdzie indziej nie ma odniesień do oryginalnej tablicyA
, ponieważ w rzeczywistości tworzy to zupełnie nową (pustą) tablicę. Powinieneś być ostrożny z tą metodą, ponieważ jeśli odwoływałeś się do tej tablicy z innej zmiennej lub właściwości, oryginalna tablica pozostanie niezmieniona. Używaj tego tylko, jeśli odwołujesz się do tablicy tylko przez jej oryginalną zmiennąA
.To także najszybsze rozwiązanie.
Ten przykładowy kod pokazuje problem, który możesz napotkać podczas korzystania z tej metody:
Metoda 2 (jako sugerowane przez Matthew Crumley )
Spowoduje to wyczyszczenie istniejącej tablicy przez ustawienie jej długości na 0. Niektórzy twierdzą, że może to nie działać we wszystkich implementacjach JavaScript, ale okazuje się, że tak nie jest. Działa również, gdy używa się „trybu ścisłego” w ECMAScript 5, ponieważ właściwość length tablicy jest właściwością odczytu / zapisu.
Metoda 3 (jako sugerowane przez Antoniego )
Używanie
.splice()
będzie działać idealnie, ale ponieważ.splice()
funkcja zwróci tablicę ze wszystkimi usuniętymi elementami, faktycznie zwróci kopię oryginalnej tablicy. Testy porównawcze sugerują, że nie ma to żadnego wpływu na wydajność.Metoda 4 (jako sugerowane przez tanguy_k )
To rozwiązanie nie jest bardzo zwięzłe i jest również najwolniejszym rozwiązaniem, w przeciwieństwie do wcześniejszych testów porównawczych wymienionych w pierwotnej odpowiedzi.
Wydajność
Ze wszystkich metod czyszczenia istniejącej tablicy metody 2 i 3 są bardzo podobne pod względem wydajności i są znacznie szybsze niż metoda 4. Zobacz ten test porównawczy .
Jak zauważył Diadistis w odpowiedzi poniżej, oryginalne testy porównawcze, które zastosowano do określenia wydajności czterech opisanych powyżej metod, były wadliwe. Oryginalny test ponownie wykorzystał wyczyszczoną tablicę, więc drugą iteracją było wyczyszczenie tablicy, która była już pusta.
Poniższy test naprawia tę usterkę: http://jsben.ch/#/hyj65 . Wyraźnie pokazuje, że metody # 2 (właściwość length) i # 3 (splice) są najszybsze (nie licząc metody nr 1, która nie zmienia oryginalnej tablicy).
To był gorący temat i przyczyną wielu kontrowersji. W rzeczywistości istnieje wiele poprawnych odpowiedzi, a ponieważ odpowiedź ta była od dawna oznaczona jako odpowiedź zaakceptowana, w tym miejscu uwzględnię wszystkie metody. Jeśli głosujesz na tę odpowiedź, proszę głosować również na inne odpowiedzi, o których wspomniałem.
źródło
while (A.length) { A.pop(); }
, nie ma potrzeby> 0
> 0
jest bardziej czytelny IMHO. I nie ma między nimi żadnej różnicy wydajności.b
zawiera odniesienie do starej tablicy nawet poa
przypisaniu nowej.c
id
kontynuuj odwoływanie się do tej samej tablicy. Dlatego oczekuje się różnicy w wynikach.while(A.pop())
jeśli przedmiot w tablicy jest falsey. Weźmy na przykład A = [2, 1, 0, -1, -2] dałoby A równe [2, 1]. Nawetwhile(A.pop() !== undefined)
nie działa, ponieważ możesz mieć tablicę z niezdefiniowaną jako jedną z wartości. Prawdopodobnie dlaczego kompilator go nie zoptymalizował.Jeśli musisz zachować oryginalną tablicę, ponieważ masz inne odniesienia do niej, które również powinny zostać zaktualizowane, możesz ją wyczyścić bez tworzenia nowej tablicy, ustawiając jej długość na zero:
źródło
myarray.push(whatever)
dodaje jeden do długości. Tak więc ustawienie długości obcina tablicę, ale nie jest trwałe.length
jest specjalną właściwością, ale nie tylko do odczytu, więc nadal będzie działać.Tutaj realizacja najszybciej pracujejednocześnie zachowując tę samą tablicę ( „zmienny”):Dla twojej informacji nie można tego uprościć
while (array.pop())
: testy zakończą się niepowodzeniem.FYI Mapa i Set określić
clear()
, byłoby to logiczne wydaje się miećclear()
na tablicy zbyt.Wersja TypeScript:
Odpowiednie testy:
Tutaj zaktualizowany jsPerf:
http://jsperf.com/array-destroy/32http://jsperf.com/array-destroy/152źródło
Array.prototype
i robiła coś nieco innego, to cały kod[].clear()
był nieco niepoprawny. Debugowanie nie byłoby przyjemne. Zatem ogólny komunikat brzmi: Nie modyfikuj globałów.function clear(arr) { while(arr.length) arr.pop(); }
, a następnie wyczyść tablice za pomocąclear(arr)
zamiastarr.clear()
..splice()
i.length=0
. Testy porównawcze były niepoprawne. Zobacz moją zaktualizowaną odpowiedź.Bardziej przyjaznym dla różnych przeglądarek i bardziej optymalnym rozwiązaniem będzie użycie
splice
metody do opróżnienia zawartości tablicy A, jak poniżej:A.splice(0, A.length);
źródło
splice
modyfikuje tablicę i zwraca usunięte wpisy. Najpierw przeczytaj dokumentację: developer.mozilla.org/en-US/docs/JavaScript/Reference/…A.splice(0, A.length),0;
. Pozostawiłoby to wartość zwrotną0
tak samo jakA.length = 0;
. Powstała tablica jest nadal tworzona i powinna powodować wolniejsze działanie skryptu: ( jsperf ~ 56% wolniej). Wpłynie to na implementację przeglądarki, chociaż nie widzę powodu, dla któregosplice
byłoby szybsze niż ustawienielength
.A.splice(0)
działa.Odpowiedzi, które mają obecnie nie mniej niż 2739 głosów pozytywnych, są mylące i niepoprawne.
Pytanie brzmi: „Jak opróżnić istniejącą tablicę?” Np
A = [1,2,3,4]
. Dla .Powiedzenie „
A = []
jest odpowiedzią” jest ignoranckie i absolutnie niepoprawne.[] == []
jest fałszywe .Wynika to z faktu, że te dwie tablice są dwoma oddzielnymi, indywidualnymi obiektami, posiadającymi własne dwie tożsamości, zajmującymi własną przestrzeń w świecie cyfrowym, każdy z osobna.
Powiedzmy, że twoja matka prosi cię o opróżnienie kosza na śmieci.
A = [1,2,3,4]; A = [];
Opróżnianie obiektu tablicy jest najłatwiejszą rzeczą w historii:
W ten sposób puszka pod „A” jest nie tylko pusta, ale także tak czysta jak nowa!
Ponadto nie musisz ręcznie usuwać śmieci, dopóki puszka nie będzie pusta! Zostaliśmy poproszeni o opróżnienie istniejącego, całkowicie, za jednym razem, aby nie podnosić śmieci, dopóki puszka się nie opróżni, jak w:
Ponadto, aby położyć lewą rękę na dole kosza, trzymając ją prawą górą, aby móc wyciągnąć jej zawartość, jak w:
Nie, poproszono Cię o opróżnienie:
Jest to jedyny kod, który poprawnie opróżnia zawartość danej tablicy JavaScript.
źródło
A(n) = A.splice( 0, A.length );
konieczność wykonania kopii zapasowej poprzedniej zawartości. psArray.length
jest metodą odczytu / zapisu \ na wypadek, gdybyś przeoczył ten podstawowy fakt. Oznacza to, że możesz go rozszerzyć na nową długość, nie możesz przyciąć go na dowolną długość, a między innymi możesz odrzucić wszystkich członków, skracając jego długość do 0. To szwajcarski nóż z tablicy.Test wydajności:
http://jsperf.com/array-clear-methods/3
źródło
Możesz dodać to do pliku JavaScript, aby umożliwić „wyczyszczenie” tablic:
Następnie możesz użyć tego w następujący sposób:
Lub jeśli chcesz mieć pewność, że czegoś nie zniszczysz:
Wiele osób uważa, że nie powinieneś modyfikować obiektów rodzimych (takich jak Array), i jestem skłonny się zgodzić. Zachowaj ostrożność przy podejmowaniu decyzji, jak sobie z tym poradzić.
źródło
clear
klucz?Istnieje wiele zamieszania i dezinformacji dotyczących czasu; wydajność pop / shift zarówno w odpowiedziach, jak i komentarzach. Rozwiązanie while / pop ma (zgodnie z oczekiwaniami) najgorszą wydajność . W rzeczywistości dzieje się tak, że konfiguracja jest uruchamiana tylko raz dla każdej próbki, która uruchamia fragment kodu w pętli. na przykład:
Utworzyłem nowy test, który działa poprawnie:
http://jsperf.com/empty-javascript-array-redux
Ostrzeżenie: nawet w tej wersji testu nie widać rzeczywistej różnicy, ponieważ klonowanie tablicy zajmuje większość czasu testu. Nadal pokazuje, że
splice
jest to najszybszy sposób na wyczyszczenie tablicy (nie biorąc[]
pod uwagę, ponieważ chociaż jest najszybszy, tak naprawdę nie usuwa istniejącej tablicy).źródło
Jeśli jesteś zainteresowany alokacją pamięci, możesz porównać każde podejście, używając czegoś takiego jak ten jsfiddle w połączeniu z zakładką osi czasu chrome dev tools. Będziesz chciał użyć ikony kosza na dole, aby wymusić odśmiecanie po „wyczyszczeniu” tablicy. To powinno dać ci bardziej konkretną odpowiedź dla wybranej przeglądarki. Wiele odpowiedzi tutaj jest starych i nie chciałbym na nich polegać, a raczej przetestować, jak w powyższej odpowiedzi @ tanguy_k.
(wprowadzenie do wyżej wymienionej karty można sprawdzić tutaj )
Stackoverflow zmusza mnie do skopiowania jsfiddle, więc oto:
I należy pamiętać, że może to zależeć od typu elementów tablicy, ponieważ javascript zarządza łańcuchami inaczej niż inne typy pierwotne, nie mówiąc już o tablicach obiektów. Typ może mieć wpływ na to, co się stanie.
źródło
Możesz łatwo utworzyć funkcję, aby to zrobić, zmienić długość, a nawet dodać ją do natywnej macierzy jako
remove()
funkcję do ponownego użycia.Wyobraź sobie, że masz tę tablicę:
OK, po prostu uruchom to:
a wynikiem jest:
łatwy sposób na opróżnienie tablicy ...
Również za pomocą pętli, która nie jest konieczna, ale po prostu inny sposób:
Istnieje również trudny sposób, o którym możesz pomyśleć, na przykład coś takiego:
Więc jeśli arr ma 5 elementów, podzieli 5 elementów od 0, co oznacza, że nic nie pozostanie w tablicy.
Również inne sposoby, takie jak po prostu przypisz tablicę, na przykład:
Jeśli spojrzysz na funkcje macierzy, istnieje wiele innych sposobów, aby to zrobić, ale najbardziej zalecaną może być zmiana długości.
Jak już powiedziałem, możesz także prototypować remove (), ponieważ jest to odpowiedź na twoje pytanie. możesz po prostu wybrać jedną z powyższych metod i prototypować ją do obiektu Array w JavaScript, na przykład:
i możesz to tak nazwać, aby opróżnić dowolną tablicę w aplikacji javascript:
źródło
I nazwij to:
array.clear();
źródło
A.splice(0);
Właśnie to zrobiłem na pewnym kodzie, nad którym pracuję. Wyczyścił tablicę.
źródło
Jeśli używasz
Następnie przypisujesz nowe odwołanie do tablicy, jeśli odwołanie w a jest już przypisane do jakiejkolwiek innej zmiennej, to również nie opróżni tej tablicy, a zatem śmieciarz nie zbierze tej pamięci.
Np.
lub
Kiedy określimy
a.length
, po prostu resetujemy granice tablicy, a pamięć dla pozostałych elementów tablicy zostanie połączona przez moduł czyszczenia pamięci.Zamiast tych dwóch rozwiązań są lepsze.
i
Zgodnie z poprzednią odpowiedzią kenshou.html druga metoda jest szybsza.
źródło
a.length
, nie rozumiem, co ta nowa odpowiedź dodaje do wątku?a.length=0;
wykonywania? Jak działałyby te silnikia.length=500;
ia.length=4;
?var a = [1]; var b = a; a.length = 0; console.log(b)
drukujeArray [ ]
, więc nie wydaje mi się, że tworzy dla mnie nową tablicę.Użyj zmodyfikowanej wersji początkowej sugestii Jana :
źródło
Jeśli używasz stałych, nie masz wyboru:
Nie możesz ponownie przypisać:
Możesz tylko obciąć:
źródło
Aby opróżnić bieżącą lokalizację pamięci tablicy, użyj:
'myArray.length = 0'
lub'myArray.pop() UN-till its length is 0'
length
: Możesz ustawić właściwość length, aby obciąć tablicę w dowolnym momencie. Po rozszerzeniu tablicy poprzez zmianę jej właściwości długość rośnie liczba rzeczywistych elementów.pop()
: Metoda pop usuwa ostatni element z tablicy i zwraca, która zwraca usuniętą wartość.shift()
: Metoda shift usuwa element o indeksie zeroeth i przesuwa wartości przy kolejnych indeksach w dół, a następnie zwraca usuniętą wartość.Przykład:
new Array() | []
Utwórz tablicę z nową lokalizacją pamięci za pomocąArray constructor
lubarray literal
.slice()
: Używając funkcji wycinania, otrzymujemy płytką kopię elementów z oryginalnej tablicy, z nowym adresem pamięci, dzięki czemu wszelkie modyfikacje cloneArr nie wpłyną na rzeczywistą | oryginalną tablicę.źródło
length = ?
zamiast po prostulength
.Dziwi mnie, że nikt jeszcze tego nie zasugerował:
Daje to tablicę w zupełnie innym stanie niż inne rozwiązania. W pewnym sensie tablica została „opróżniona”:
Możesz stworzyć równoważną tablicę za pomocą
[,,,,]
lubArray(4)
źródło
Użyj poniżej, jeśli chcesz opróżnić Array 2+ FormArray.
źródło