Oto mój kod JavaScript do tej pory:
var linkElement = document.getElementById("BackButton");
var loc_array = document.location.href.split('/');
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2])));
linkElement.appendChild(newT);
Obecnie trwa od drugiego do ostatniego elementu w tablicy z adresu URL. Chcę jednak sprawdzić, czy ma być ostatni element w tablicy, "index.html"
a jeśli tak, to zamiast tego złap trzeci.
javascript
arrays
balexander
źródło
źródło
const [lastItem] = arr.slice(-1)
.pop()
usuwa ostatni element, który modyfikuje oryginalną tablicę. To nie to samo, co zwykłe wyszukiwanie tej wartości.Użyj Array.pop :
Ważne : Zwraca ostatni element i usuwa go z tablicy
źródło
Krótsza wersja tego, co opublikował @chaiguy:
Odczytywanie indeksu -1
undefined
już powraca .EDYTOWAĆ:
Obecnie preferuje się używanie modułów i unikanie dotykania prototypu lub korzystania z globalnej przestrzeni nazw.
źródło
var lastItem = [3,2,1,5].last();
. WartośćlastItem
wynosi5
.Do NOT modify objects you Do NOT own
. Jest to niebezpieczne z wielu powodów, takich jak: 1. Inni programiści pracujący w twoim zespole mogą się pomylić, ponieważ ta metoda nie jest standardowa 2. przy każdej aktualizacji bibliotek lub nawet przy użyciu niższej lub wyższej wersji ECMAScript może łatwo UTRACIĆ!Array.prototype
, ale powinieneś użyćObject.assign(Array.prototype, 'last', { value: function () { … } });
. W przeciwnym razie właściwość będzie policzalna.Dwie opcje to:
lub
Pierwszy jest szybszy, ale drugi wygląda ładniej
http://jsperf.com/slice-vs-length-1-arr
źródło
Oto, jak go uzyskać bez wpływu na oryginalną tablicę
Jeśli użyjesz pop (), zmodyfikuje twoją tablicę
Ale możesz użyć tego, aby nie miało to wpływu na oryginalną tablicę:
źródło
pop()
: po prostu zróbarr.slice(-1)[0]
„Najczystszym” sposobem ES6 (IMO) byłoby:
Pozwala to uniknąć mutacji
foo
, tak jak.pop()
by to było, gdybyśmy nie korzystali z operatora rozprzestrzeniania.To powiedziawszy, podoba mi się również
foo.slice(-1)[0]
rozwiązanie.źródło
.slice(-1)[0]
ale wolniejszy..slice
Wolałbym używać
array.pop()
niż indeksów.w ten sposób zawsze otrzymujesz element poprzedzający index.html (pod warunkiem, że twoja tablica ma izolowany index.html jako jeden element). Uwaga: jednak stracisz ostatnie elementy z tablicy.
źródło
Myślę, że jeśli chcesz tylko uzyskać element bez usuwania, to jest prostsze użyj tego:
Uwaga: Jeśli tablica jest pusta (np.
[]
), Funkcja zwróciundefined
.nawiasem mówiąc ... nie sprawdziłem wydajności, ale myślę, że jest prostszy i czystszy do napisania
źródło
arr.slice(-1)[0] === arr[arr.length - 1]
), i b) jest powolna, ponieważ kopiujearr
się do nowej tablicy (zobacz stackoverflow.com/a/51763533/2733244 w celu pomiaru wydajności).const [lastItem] = array.slice(-1);
Array.prototype.slice z -1 można użyć do utworzenia nowej tablicy zawierającej tylko ostatni element oryginalnej tablicy, a następnie można użyć Przypisania do restrukturyzacji, aby utworzyć zmienną przy użyciu pierwszego elementu tej nowej tablicy.
źródło
Uzyskanie ostatniego elementu tablicy można osiągnąć za pomocą wycinka metody z wartościami ujemnymi.
Więcej na ten temat możesz przeczytać tutaj na dole.
Użycie pop () zmieni tablicę, co nie zawsze jest dobrym pomysłem.
źródło
arr.slice(-1)[0]
, jak tej odpowiedzi .array[array.length - 1]
jsperf.com/get-last-item-from-array/13Możesz użyć tego wzoru ...
Choć brzmi to dość ładnie, należy pamiętać, że tworzy nową tablicę więc jest mniej wydajny niż inne rozwiązania, ale prawie nigdy nie będzie gardłem wydajności aplikacji.
źródło
To pytanie było już dawno, więc jestem zaskoczony, że nikt nie wspomniał o ponownym włączeniu ostatniego elementu po
pop()
.arr.pop()
jest dokładnie tak samo wydajny, jakarr[arr.length-1]
i oba mają taką samą prędkość jakarr.push()
.Dlatego możesz uciec od:
--- EDYTOWANE [sprawdź,
thePop
czy nie jestundefined
przed pchaniem] ------ EDYCJA KOŃCOWA ---
Co można zredukować do tej samej prędkości (ta sama prędkość [EDYCJA: ale niebezpieczne!]):
Jest to dwa razy wolniejsze niż
arr[arr.length-1]
, ale nie musisz wypełniać indeksu. To jest warte złota każdego dnia.Rozwiązań, które wypróbowałem oraz w wielokrotności jednostki czasu wykonania (ETU)
arr[arr.length-1]
:[Metoda] .............. [ETU 5 elementów] ... [ETU 1 milion elementów]
Ostatnie trzy opcje, W SZCZEGÓLNOŚCI
[...arr].pop()
, stają się BARDZO gorsze wraz ze wzrostem wielkości tablicy. Na komputerze bez ograniczeń pamięci mojego komputera[...arr].pop()
prawdopodobnie zachowuje coś w rodzaju współczynnika 120: 1. Mimo to nikt nie lubi wieprza zasobów.źródło
[]
zostanie zmienione[undefined]
. Musisz chronić pchnięcie do tyłu za pomocą jawnejundefined
kontroli, coś w stylumyPop !== undefined && arr.push(myPop)
Jeśli ktoś chce uzyskać ostatni element za jednym razem, może użyć
Array#splice()
:W tym przypadku nie ma potrzeby przechowywania podzielonych elementów w tablicy, a następnie przejścia do ostatniego elementu. Jeśli zdobycie ostatniego elementu jest jedynym celem, należy to wykorzystać.
Uwaga: Zmienia to oryginalną tablicę poprzez usunięcie jej ostatniego elementu. Myśleć
splice(-1,1)
jakopop()
funkcji, które pojawia ostatni element.źródło
["hi"]
vs"hi"
.Dla tych, którzy nie boją się przeciążać prototypu Array (a przy maskowaniu wyliczeń nie powinieneś być):
źródło
jQuery rozwiązuje to starannie:
źródło
Zazwyczaj używam podkreślników , dzięki którym możesz po prostu zrobić
Dla mnie jest to bardziej semantyczne niż
loc_array.slice(-1)[0]
źródło
Oto więcej sztuki Javascript, jeśli tu przyszedłeś jej szukać
W duchu innej odpowiedzi, która została użyta
reduceRight()
, ale krótsza:Opiera się na fakcie, że jeśli nie podasz wartości początkowej, ostatni element jest wybierany jako element początkowy (sprawdź tutaj dokumenty ). Ponieważ wywołanie zwrotne po prostu zwraca wartość początkową, ostatni element będzie zwracany na końcu.
Uważaj, że należy to uznać za sztukę Javascript i nie jest to sposób, w jaki poleciłbym to zrobić, głównie dlatego, że działa w czasie O (n), ale także dlatego, że szkodzi czytelności.
A teraz poważna odpowiedź
Najlepszy sposób, jaki widzę (biorąc pod uwagę, że chcesz bardziej zwięzły niż
array[array.length - 1]
), to:Następnie wystarczy użyć funkcji:
Ta funkcja jest przydatna w przypadku, gdy masz do czynienia z anonimową tablicą, taką jak
[3, 2, 1, 5]
używana powyżej, w przeciwnym razie musiałbyś utworzyć ją dwukrotnie, co byłoby nieefektywne i brzydkie:Ugh.
Na przykład, oto sytuacja, w której masz anonimową tablicę i musisz zdefiniować zmienną, ale
last()
zamiast tego możesz użyć :źródło
Po prostu umieszczam tutaj inną opcję.
Uważam, że powyższe podejście jest bardziej czyste i krótkie onliner. Proszę, spróbuj tego.
Uwaga: zmodyfikuje oryginalną tablicę, jeśli nie chcesz jej modyfikować, możesz jej użyć
slice()
Dzięki @VinayPai za zwrócenie na to uwagi.
źródło
Wiele sposobów na znalezienie ostatniej wartości tablicy w javascript
źródło
console.log(arr.reverse()[0])
- gratulacje, właśnie zmodyfikowałeś oryginalną tablicę.To najlepsze opcje z punktu widzenia wydajności (~ 1000 razy szybciej niż arr.slice (-1)).
źródło
Osobiście głosowałbym za odpowiedzią kuporific / kritzikratzi. Metoda array [array.length-1] staje się bardzo brzydka, jeśli pracujesz z zagnieżdżonymi tablicami.
źródło
W etapie 1 propozycji ECMAScript istnieje sugestia dodania właściwości tablicy, która zwróci ostatni element: wniosek-tablica-ostatnia .
Składnia:
Możesz użyć polyfill .
Autor wniosku: Keith Cirkel ( autor chai )
źródło
Aby zapobiec usunięciu ostatniego elementu z tablicy pochodzenia, możesz użyć
Obsługiwany głównie przez wszystkie przeglądarki (ES6)
źródło
Możesz dodać
last()
funkcję doArray
prototypu.źródło
Cokolwiek robisz, nie tylko używaj
reverse()
!!!Kilka odpowiedzi wspomina,
reverse
ale nie wspomina o tym, żereverse
modyfikuje oryginalną tablicę i nie zwraca (jak w innym języku lub frameworku) kopii.To może być najgorszy typ kodu do debugowania!
źródło
[...animals].reverse()
[1,3,4,5,"last"].slice().reverse()[0]
Restrukturyzacja obiektów ES6 to kolejna droga.
Wyodrębniasz właściwość length z tablicy za pomocą destrukcji obiektu. Tworzysz kolejny klucz dynamiczny, używając już wyodrębnionego klucza przez [length-1] i przypisujesz go do końca , wszystko w jednym wierszu.
źródło
Możesz dodać nowy getter właściwości do prototypu
Array
, aby był dostępny we wszystkich instancjachArray
.Gettery umożliwiają dostęp do wartości zwracanej przez funkcję tak, jakby to była wartość właściwości. Zwracana wartość funkcji jest oczywiście ostatnią wartością tablicy (
this[this.length - 1]
).Na koniec
last
owijamy go w warunek, który sprawdza, czy właściwość -prop nadal jestundefined
(nie zdefiniowana przez inny skrypt, który może na niej polegać).Nie działa w IE ≤ 8.
źródło
Array.prototype.last
jest zawszeundefined
? The if nie działa pod Chrome 36EDYTOWANE:
Ostatnio wymyśliłem jeszcze jedno rozwiązanie, które moim zdaniem jest najlepsze dla moich potrzeb:
Dzięki powyższej definicji mogę teraz powiedzieć:
Nazwa „w” oznacza „opakowanie”. Możesz zobaczyć, jak możesz łatwo dodać do tego opakowania więcej metod niż „last ()”.
Mówię „najlepiej dla moich potrzeb”, ponieważ pozwala mi to łatwo dodawać inne takie „metody pomocnicze” do każdego wbudowanego typu JavaScript. Na myśl przychodzi na przykład car () i cdr () z Lisp.
źródło
w
funkcję, po prostu spraw, aby funkcja zwróciła ostatni element.w([1,2,3]).length
jest niezdefiniowany.w([1,2,3])[1]
jest niezdefiniowany. Nie wygląda mi to na opakowanie. I jest błąd składniowy. Masz dodatkowe „;”. Zobacz stackoverflow.com/a/49725374/458321, aby dowiedzieć się, jak napisać opakowanie klasy (klasa SutString) i użyć refleksji, aby wypełnić to opakowanie. Chociaż, imho, opakowania są przesadzone. Lepiej używać enkapsulacji, jak prawie masz.return { arr: anArray, last() { return anArray[anArray.length - 1]; } };
. Ponadto w jest zbyt ogólne. Call to ArrayW lub coś takiego.Myślę, że najłatwiejszym i najbardziej nieefektywnym sposobem jest:
źródło