778 Stimmen

Auswählen des letzten Elements in einem JavaScript-Array

Ich mache eine Anwendung, die den Standort und den Weg eines Benutzers in Echtzeit aktualisiert und auf einer Google-Karte anzeigt. Ich habe eine Funktionalität, die es ermöglicht, mehrere Benutzer gleichzeitig zu verfolgen, indem ich ein Objekt verwende, das jede Sekunde aktualisiert wird.

Wenn ein Benutzer eine Taste in der Android-App drückt, werden die Koordinaten an eine Datenbank gesendet, und jedes Mal, wenn sich der Standort ändert, wird eine Markierung auf der Karte aktualisiert (und eine Polylinie gebildet).

Da ich mehrere Benutzer habe, sende ich eine eindeutige und zufällig generierte alphanumerische Zeichenfolge, damit ich für jeden Benutzer einen individuellen Pfad anzeigen kann. Wenn das JS diese Daten aus der Datenbank abruft, prüft es, ob der Benutzer existiert, und wenn nicht, erstellt es einen neuen Schlüssel, dessen Wert eine Liste ist. Es würde etwa so aussehen:

loc = {f096012e-2497-485d-8adb-7ec0b9352c52: [new google.maps.LatLng(39, -86),
                                              new google.maps.LatLng(38, -87),
                                              new google.maps.LatLng(37, -88)],
       44ed0662-1a9e-4c0e-9920-106258dcc3e7: [new google.maps.LatLng(40, -83),
                                              new google.maps.LatLng(41, -82),
                                              new google.maps.LatLng(42, -81)]}

Was ich tue, ist das Speichern einer Liste von Koordinaten als Wert des Schlüssels, der die ID des Benutzers ist. Mein Programm aktualisiert diese Liste jedes Mal, wenn der Standort geändert wird, indem es der Liste hinzugefügt wird (dies funktioniert ordnungsgemäß).

Ich muss den Standort der Markierung jedes Mal aktualisieren, wenn sich der Standort ändert. Ich möchte dies tun, indem ich das letzte Element im Array auswähle, da dies der letzte bekannte Standort wäre. Im Moment wird jedes Mal, wenn der Standort geändert wird, eine neue Markierung zur Karte hinzugefügt (jeder der Punkte im Beispiel würde eine Markierung an diesem Standort anzeigen), sodass weiterhin Markierungen hinzugefügt werden.

Ich würde eine "for (x in loc)`-Anweisung jedes Mal, wenn der Ort aktualisiert, um den letzten Ort aus der Liste zu greifen und verwenden, um die Markierung zu aktualisieren. Wie wähle ich dieses letzte Element aus dem Array innerhalb des Hashes aus?

38voto

amay0048 Punkte 941
var last = array.slice(-1)[0];

Ich finde slice at -1 nützlich, um das letzte Element (insbesondere eines Arrays mit unbekannter Länge) zu erhalten, und die Leistung ist viel besser als die Berechnung der Länge minus 1.

Mozilla-Dokumente über Slice

Leistung der verschiedenen Methoden zur Auswahl des letzten Array-Elements

38voto

svarog Punkte 8989

Unterstrich y Lodash haben die _.last(Array) Methode, die das letzte Element in einem Array zurückgibt. Sie funktionieren beide ungefähr gleich

_.last([5, 4, 3, 2, 1]);
=> 1

Ramda hat auch eine _.last Funktion

R.last(['fi', 'fo', 'fum']); //=> 'fum'

19voto

Sreerag Punkte 293

Das hat funktioniert:

array.reverse()[0]

17voto

XåpplI'-I0llwlg'I - Punkte 20190

Sie können eine getter en Array.prototype :

if (!Array.prototype.hasOwnProperty("last")) {
  Object.defineProperty(Array.prototype, "last", {
    get() {
      return this[this.length - 1];
    }
  });
}

console.log([9, 8, 7, 6].last); // => 6

Wie Sie sehen können, sieht der Zugriff nicht wie ein Funktionsaufruf aus; die Getter-Funktion wird intern aufgerufen.

17voto

Ryan Wood Punkte 342

Viele Leute antworten also mit pop(), aber die meisten scheinen nicht zu wissen, dass dies eine destruktive Methode ist.

var a = [1,2,3]
a.pop()
//3
//a is now [1,2]

Also, eine wirklich dumme, nicht zerstörerische Methode:

var a = [1,2,3]
a[a.push(a.pop())-1]
//3

ein Push-Pop, wie in den 90ern :)

push hängt einen Wert an das Ende eines Arrays an und gibt die Länge des Ergebnisses zurück. also

d=[]
d.push('life') 
//=> 1
d 
//=>['life']

pop gibt den Wert des letzten Elements eines Arrays zurück, bevor es den Wert an diesem Index entfernt.

c = [1,2,1]
c.pop() 
//=> 1
c 
//=> [1,2]

Arrays sind 0-indiziert, d.h. c.length => 3, c[c.length] => undefiniert (weil Sie nach dem 4. Wert suchen, wenn Sie das tun (dieser Grad an Tiefe ist für alle unglücklichen Anfänger, die hier landen)).

Wahrscheinlich nicht die beste, oder sogar eine gute Methode für Ihre Anwendung, was mit Verkehr, Churn, blah. aber für Traversing unten ein Array, Streaming es auf eine andere, nur dumm mit ineffizienten Methoden, dies. Auf jeden Fall das.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X