Hier is mijn JavaScript-code tot nu toe:
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);
Momenteel wordt het voorlaatste item in de array uit de URL gehaald. Ik wil echter controleren of het laatste item in de array "index.html"
is en zo ja, in plaats daarvan het op twee na laatste item pakken.
Antwoord 1, autoriteit 100%
if (loc_array[loc_array.length - 1] === 'index.html') {
// do something
} else {
// something else
}
In het geval dat uw server hetzelfde bestand voor “index.html” en “inDEX.htML” bedient, kunt u ook gebruiken: .toLowerCase()
.
Maar je zou kunnen overwegen om deze server-side indien mogelijk te doen: het zal schoner zijn en werken voor mensen zonder JS.
Antwoord 2, autoriteit 89%
Ik weet niet zeker of er een nadeel is, maar dit lijkt vrij beknopt:
arr.slice(-1)[0]
of
arr.slice(-1).pop()
Beide retourneren undefined
als de array leeg is.
Antwoord 3, autoriteit 22%
Gebruik Array.pop:
var lastItem = anArray.pop();
Belangrijk : dit retourneert het laatste element en Verwijdert van de array
4, Autoriteit 12%
een kortere versie van wat @chaiguy heeft geplaatst:
Array.prototype.last = function() {
return this[this.length - 1];
}
Het lezen van de -1-index retourneert undefined
reeds.
bewerken:
Tegenwoordig lijkt de voorkeur om modules te gebruiken en om te voorkomen dat het prototype wordt aangeraakt of met behulp van een globale naamruimte.
export function last(array) {
return array[array.length - 1];
}
5, Autoriteit 11%
Twee opties zijn:
var last = arr[arr.length - 1]
of
var last = arr.slice(-1)[0]
De eerste is sneller, maar de laatste ziet er mooier uit
http://jsperf.com/slice-vs-length-1-arr
6, Autoriteit 5%
Hier is hoe u het zonder effect op de originele array
krijgt
a = [1,2,5,6,1,874,98,"abc"];
a.length; //returns 8 elements
Als u POP () gebruikt, wijzigt het uw array
a.pop(); // will return "abc" AND REMOVES IT from the array
a.length; // returns 7
Maar u kunt dit gebruiken, dus het heeft geen effect op de originele array:
a.slice(-1).pop(); // will return "abc" won't do modify the array
// because slice creates a new array object
a.length; // returns 8; no modification and you've got you last element
Antwoord 7, autoriteit 5%
Prestaties
Vandaag 2020.05.16 voer ik tests uit van gekozen oplossingen op Chrome v81.0, Safari v13.1 en Firefox v76.0 op MacOs High Sierra v10.13.6
Conclusies
arr[arr.length-1]
(D) wordt aanbevolen als snelste oplossing voor meerdere browsers- veranderlijke oplossing
arr.pop()
(A) en onveranderlijke_.last(arr)
(L) zijn snel - oplossingen I, J zijn traag voor lange strings
- oplossingen H, K (jQuery) zijn het langzaamst in alle browsers
Details
Ik test twee gevallen voor oplossingen:
voor twee gevallen
- korte tekenreeks – 10 tekens – u kunt de test HIER
- lange reeks – 1M tekens – u kunt de test HIER
uitvoeren
uitvoeren
Antwoord 8, autoriteit 4%
De “schoonste” ES6-manier (IMO) zou zijn:
const foo = [1,2,3,4];
const bar = [...foo].pop();
Dit vermijdt het muteren van foo
, zoals .pop()
zou hebben gedaan, als we de spread-operator niet hadden gebruikt.
Dat gezegd hebbende, vind ik de oplossing foo.slice(-1)[0]
ook goed.
Antwoord 9, autoriteit 3%
const [lastItem] = array.slice(-1);
Array.prototype.slicemet -1 kan worden gebruikt om een nieuwe array te maken die alleen het laatste item van de originele array bevat, je kunt dan Destructuring Assignmentom een variabele te maken met het eerste item van die nieuwe array.
const lotteryNumbers = [12, 16, 4, 33, 41, 22];
const [lastNumber] = lotteryNumbers.slice(-1);
console.log(lotteryNumbers.slice(-1));
// => [22]
console.log(lastNumber);
// => 22
Antwoord 10, autoriteit 3%
Ik gebruik liever array.pop()
dan indexen.
while(loc_array.pop()!= "index.html"){
}
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length])));
Op deze manier krijg je altijd het element Vorige op index.html (het bieden van je array heeft geïsoleerde index.html als één item). Opmerking: U verliest echter de laatste elementen uit de array.
11, Autoriteit 2%
const lastElement = myArray[myArray.length - 1];
Dit is de beste opties van Performance Point of View (~ 1000 keer sneller dan arr.slice(-1)
).
12, Autoriteit 2%
Het laatste item van een array krijgen kan worden bereikt door gebruik te maken van de Slice -methode met negatieve waarden.
U kunt er meer over lezen hier onderaan.
var fileName = loc_array.slice(-1)[0];
if(fileName.toLowerCase() == "index.html")
{
//your code...
}
Het gebruik van POP () zal uw array wijzigen, wat niet altijd een goed idee is.
13, Autoriteit 2%
Als iemand het laatste element in één keer wil hebben, kan hij/zij Array#splice()
:
lastElement = document.location.href.split('/').splice(-1,1);
Hier is het niet nodig om de gesplitste elementen in een array op te slaan en vervolgens naar het laatste element te gaan. Als het verkrijgen van het laatste element het enige doel is, moet dit worden gebruikt.
Opmerking: Dit verandert de originele arraydoor het laatste element te verwijderen. Beschouw splice(-1,1)
als een pop()
-functie die het laatste element laat verschijnen.
Antwoord 14, autoriteit 2%
Deze vraag bestaat al een lange tijd, dus het verbaast me dat niemand het heeft over het terugplaatsen van het laatste element na een pop()
.
arr.pop()
is precies zo efficiënt als arr[arr.length-1]
, en beide hebben dezelfde snelheid als arr.push()
.
Daarom kun je wegkomen met:
—EDITED [controleer of thePop
niet undefined
is voordat u drukt]—
let thePop = arr.pop()
thePop && arr.push(thePop)
—END EDIT—
Wat tot dit kan worden teruggebracht (dezelfde snelheid [EDIT: maar onveilig!]):
arr.push(thePop = arr.pop()) //Unsafe if arr empty
Dit is twee keer zo langzaam als arr[arr.length-1]
, maar je hoeft niet te rommelen met een index. Dat is elke dag goud waard.
Van de oplossingen die ik heb geprobeerd, en in veelvouden van de Execution Time Unit (ETU) van arr[arr.length-1]
:
[Methode] ………….. [ETUS 5 ELEMS] … [ETU 1 miljoen ELEMS]
arr[arr.length - 1] ------> 1 -----> 1
let myPop = arr.pop()
arr.push(myPop) ------> 2 -----> 2
arr.slice(-1).pop() ------> 36 -----> 924
arr.slice(-1)[0] ------> 36 -----> 924
[...arr].pop() ------> 120 -----> ~21,000,000 :)
De laatste drie opties, vooral [...arr].pop()
, Krijg heel veel erger als de grootte van de array toeneemt. Op een machine zonder de geheugenbeperkingen van mijn machine, [...arr].pop()
Holt waarschijnlijk iets als het is 120: 1-ratio. Toch houdt niemand van een resource-varken.
15, Autoriteit 2%
meerdere manieren om de laatste waarde van een array in JavaScript te vinden
- zonder de originele array
te beïnvloeden
var arr = [1,2,3,4,5];
console.log(arr.slice(-1)[0])
console.log(arr[arr.length-1])
const [last] = [...arr].reverse();
console.log(last)
let copyArr = [...arr];
console.log(copyArr.reverse()[0]);
16, Autoriteit 2%
Gewoon hier een andere optie plaatsen.
loc_array.splice(-1)[0] === 'index.html'
Ik vond de bovenstaande aanpak meer schoon en korte onliner. Alsjeblieft, vrijgelaten om deze te proberen.
Opmerking: het zal de originele array wijzigen, als u het niet wilt wijzigen, kunt u slice()
loc_array.slice(-1)[0] === 'index.html'
Bedankt @VINAYPAI voor dit uit te wijzen.
17
ES6 Object-destructurering is een andere manier om te gaan.
const {length, [length-1]: last}=[1,2,3,4,5]
console.log(last)
18
Voor degenen die niet bang zijn om het array-prototype te overbelasten (en met Opsomming maskeren u zou niet moeten zijn):
Object.defineProperty( Array.prototype, "getLast", {
enumerable: false,
configurable: false,
writable: false,
value: function() {
return this[ this.length - 1 ];
}
} );
19
Ik gebruik meestal underscorejs , daarmee kunt u
gewoon doen
if (_.last(loc_array) === 'index.html'){
etc...
}
Voor mij is dat meer semantisch dan loc_array.slice(-1)[0]
Antwoord 20
jQuerylost dit netjes op:
> $([1,2,3]).get(-1)
3
> $([]).get(-1)
undefined
Antwoord 21
Het Array.prototype.at
voorstel(fase 3) voegt een methode toe voor relatieve indexering (MDN):
const myArray = [1, 2, 3]
console.log(myArray.at(-1))
// => 3
Nog een TC39-voorstel, het Array.prototype.lastItem
-voorstel(fase 1), voegt een getter toe die het laatste item in een array retourneert:
const myArray = [1, 2, 3]
console.log(myArray.lastItem)
// => 3
Het voorstel .at
is momenteel alleen geïmplementeerd in pre-releaseversies van Firefox en Safari.
.lastItem
wordt in geen enkele browser ondersteund en de kampioen van het voorstel overweegt momenteel het voorstel in te trekken.
Antwoord 22
Om te voorkomen dat het laatste item uit de oorspronkelijke array wordt verwijderd, kunt u gebruik maken van
Array.from(myArray).pop()
Meestal ondersteund door alle browsers (ES6)
Antwoord 23
In ECMAScript-voorstelFase 1er is een suggestie om een array-eigenschap toe te voegen die het laatste element retourneert: proposal-array-last.
Syntaxis:
arr.lastItem // get last item
arr.lastItem = 'value' // set last item
arr.lastIndex // get last index
Je kunt polyfillgebruiken.
Auteur voorstel: Keith Cirkel(chaiauteur)
Antwoord 24
Wat je ook doet, gebruik niet alleenreverse()
!!!
Een paar antwoorden noemen reverse
maar vermelden niet het feit dat reverse
de originele array wijzigt en niet (zoals in sommige andere talen of frameworks) teruggeeft een kopie.
var animals = ['dog', 'cat'];
animals.reverse()[0]
"cat"
animals.reverse()[0]
"dog"
animals.reverse()[1]
"dog"
animals.reverse()[1]
"cat"
Dit kan het slechtste type code zijn om te debuggen!
Antwoord 25
persoonlijk zou ik een antwoord geven door Kuporific / Kritzikratzi. De methode van de array [array.length-1] wordt erg lelijk als u met geneste arrays werkt.
var array = [[1,2,3], [4,5,6], [7,8,9]]
array.slice(-1)[0]
//instead of
array[array.length-1]
//Much easier to read with nested arrays
array.slice(-1)[0].slice(-1)[0]
//instead of
array[array.length-1][array[array.length-1].length-1]
26
Ik denk dat dit goed moet werken.
var arr = [1, 2, 3];
var last_element = arr.reverse()[0];
keer gewoon de array om en ontvang het eerste element.
EDIT: Zoals hieronder vermeld, wordt de originele array omgekeerd. Om te voorkomen dat u de code kunt wijzigen om:
var arr = [1, 2, 3];
var last_element = arr.slice().reverse()[0];
Hiermee wordt een kopie van de originele array gemaakt.
27
U kunt een last()
Functie toevoegen aan de Array
prototype.
Array.prototype.last = function () {
return this[this.length - 1];
};
bewerken:
U kunt een Symbol
gebruiken om onverenigbaarheid met andere code te voorkomen:
const last = Symbol('last');
Array.prototype[last] = function() {
return this[this.length - 1];
};
console.log([0, 1][last]());