Het laatste item in een array ophalen

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 undefinedals 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 undefinedreeds.

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:

  • veranderlijk: A,
    B,
    C,

  • onveranderlijk: D,
    E,
    F,
    G,
    H,
    Ik,
    J (mijn),

  • onveranderlijk van externe bibliotheken: K,
    L,
    M,

voor twee gevallen

  • korte tekenreeks – 10 tekens – u kunt de test HIER
  • uitvoeren

  • lange reeks – 1M tekens – u kunt de test HIER
  • 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 thePopniet undefinedis 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.atvoorstel(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 .atis momenteel alleen geïmplementeerd in pre-releaseversies van Firefox en Safari.

.lastItemwordt 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 reversemaar vermelden niet het feit dat reversede 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 Arrayprototype.

Array.prototype.last = function () {
    return this[this.length - 1];
};

bewerken:

U kunt een Symbolgebruiken 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]());

Other episodes