Abrufen des letzten Elements in einem Javascript-Objekt

92

Wenn ich ein Objekt habe wie:

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }

Wenn ich nicht im Voraus weiß, dass die Liste bis auf 'c' geht, abgesehen vom Durchlaufen des Objekts, gibt es eine Möglichkeit, das letzte Element im Objekt zu erhalten (z. B. 'carrot')?

Sprugman
quelle
Das ist eine gute Frage. Wie können Objekte auf Leere überprüft werden, ohne sie zu durchlaufen?
Lukas Eder
2
Eigenschaft nicht "Artikel". und nein, die Eigenschaftsreihenfolge ist undefiniert.
Kostenlose Beratung
Den letzten Immobilienwert , den er meint, würde ich sagen
KooiInc

Antworten:

64

Nein. Die Reihenfolge ist in JSON und den meisten anderen Schlüsselwertdatenstrukturen nicht garantiert. Daher kann das letzte Element manchmal carrotund zu anderen Zeiten bananausw. sein. Wenn Sie sich auf die Bestellung verlassen müssen , ist es am besten, sich für Arrays zu entscheiden. Die Kraft von Schlüsselwertdatenstrukturen liegt darin, auf Werte zuzugreifen keys, nicht in der Lage zu sein, das nthObjekt des Objekts abzurufen.

Alex
quelle
1
Als Erweiterung dieser völlig richtigen Antwort. Objekte sind keine Arrays, selbst wenn Sie ein assoziatives Array in JS mithilfe der Array-Markierungen erstellen, handelt []es sich tatsächlich um ein Objekt. JS hat keine assoziativen Arrays als solche, Arrays haben indizierten Zugriff und Sequenz; Objekte haben assoziativen Eigenschaftszugriff, nicht sequentiell.
Orbling
3
Ich weiß, dass ihnen keine Bestellung garantiert wird, aber wenn ich die Kontrolle über die Erstellung des Objekts habe, kann ich praktisch sicherstellen, dass sie in einer bestimmten Reihenfolge vorliegen. Die Antwort auf die Frage lautet jedoch eindeutig "Nein". :)
Sprugman
2
@sprugman: Nicht in Chrome. Eine lange hitzige Debatte tobt über dieses Thema: code.google.com/p/v8/issues/detail?id=164
Tim Down
215

Ja, es gibt einen Weg mit Object.keys(obj). Es wird auf dieser Seite erklärt :

var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"]

Wenn Sie den Wert des letzten Objekts abrufen möchten, können Sie Folgendes tun:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Kristina Stefanova
quelle
8
Dieser hätte akzeptiert werden sollen, das Object.keysfunktioniert großartig. Ich muss nur einen Weg finden, damit es auf IE8 und 7 funktioniert, da dies nur auf IE9 angezeigt wurde.
RaphaelDDL
4
Sie können direkt mit Object.values ​​(ruitObject) arbeiten, das die Werte anstelle der Schlüssel zurückgibt, und dann ein pop () für Ihr Array ausführen, um das letzte Element zurückzugeben.
Yvon Huynh
4
Die erste Antwort hier ist die richtige Antwort. Ich habe immer wieder versucht, Object.keysnur um herauszufinden, dass die Eigenschaften tatsächlich zufällig angeordnet wurden. Die tatsächliche Eigenschaftsreihenfolge unterscheidet sich von der Reihenfolge, die angezeigt wird, wenn Sie an der Browserkonsole angemeldet sind. Bei der Anmeldung an der Browserkonsole werden die Eigenschaften automatisch neu angeordnet und alphabetisch / numerisch angezeigt, was definitiv zu Verwirrung führt.
Kennsorr
1
Die JS-Spezifikation garantiert nicht die Reihenfolge des Schlüssels und kann zwischen verschiedenen Implementierungen (Engines) variieren. Daher ist es nicht möglich, die Einfügereihenfolge für zufällig generierte (verschlüsselte) Objekte zu garantieren. Das Array ist ein Objekttyp, bei dem der Schlüssel ein numerischer Index ist, um die Einfügereihenfolge unter anderen nützlichen Eigenschaften zu gewährleisten.
Ethan Doh
1
Gute Leute hatten es 2010-2013 schwer mit der Webentwicklung ...
Merc
20
last = Object.keys(obj)[Object.keys(obj).length-1];

wo obj ist dein Objekt

user3282891
quelle
1
Dies erhält den letzten Schlüssel ( 'c'in diesem Fall), aber die Frage ist so formuliert, dass der Fragesteller nach dem letzten Wert sucht ( 'carrot'). Dies fügt auch nicht wirklich etwas hinzu, das nicht bereits von Kristina Stefanovas Antwort
abgedeckt ist
13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

Quelle: http://javascriptweblog.wordpress.com

George
quelle
2
"außer durch das Objekt zu
schleifen
2
Für diejenigen, die den ersten Schlüssel eines Objekts benötigen, kann der obige Weg folgen, aber damit:for (firstProperty in myObj) { break; };
panosru
8

Lösung unter Verwendung der Destrukturierungszuweisungssyntax von ES6:

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"

ollazarev
quelle
5

Was die Reihenfolge der Objekteigenschaften in Javascript betrifft, werde ich nur auf diese Antwort verweisen:

Reihenfolge der Elemente in einer "for (… in…)" - Schleife

Speziell:

Alle modernen Implementierungen von ECMAScript durchlaufen die Objekteigenschaften in der Reihenfolge, in der sie definiert wurden

Damit jede andere Antwort hier richtig ist, gibt es keine offiziell garantierte Reihenfolge, um Eigenschaften zu beanstanden. In der Praxis gibt es jedoch (abgesehen von Fehlern, die natürlich sogar in Stein gemeißeltes, offiziell festgelegtes Verhalten vermasseln können).

Darüber hinaus wird die De-facto-Aufzählungsreihenfolge der Objekteigenschaften wahrscheinlich in zukünftigen EMCAScript-Spezifikationen kodifiziert.

Zu diesem Zeitpunkt würde ich jedoch keinen Code dafür schreiben, hauptsächlich, weil es keine integrierten Tools gibt, die bei der Reihenfolge der Objekteigenschaften helfen. Sie könnten Ihre eigenen schreiben, aber am Ende würden Sie immer jede Eigenschaft in einem Objekt durchlaufen, um ihre Position zu bestimmen.

Daher lautet die Antwort auf Ihre Frage " Nein" . Es gibt keine andere Möglichkeit, als ein Objekt zu durchlaufen.

MooGoo
quelle
Wie Sie sagen, würde ich mich definitiv nicht auf eine Reihenfolge für die Aufzählung von Objekteigenschaften verlassen. Zunächst einmal sind neue ECMAScript-Implementierungen nicht verpflichtet, diesen De-facto-Standard einzuhalten, sodass Code, der sich auf eine bestimmte Reihenfolge stützt, nicht zukunftssicher ist. Außerdem verhalten sich nicht alle aktuellen Browser gleich. Siehe diese Diskussion im Chrome Bug Tracker: code.google.com/p/v8/issues/detail?id=164 . Schließlich würde ich nicht erwarten, dass die ECMAScript-Spezifikation dies bald standardisiert.
Tim Down
5

Verwenden Sie ein Array, kein Objektliteral, wenn die Reihenfolge wichtig ist.

list = ['apple', 'banana', 'carrot'];

Oder so ähnlich

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};

Oder auch..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];

Es dictwird nicht garantiert, dass die Schlüssel für in Ordnung sind.

meder omuraliev
quelle
5

Sie können dies versuchen. Dadurch wird der letzte Artikel gespeichert. Hier muss obj in Array konvertieren. Verwenden Sie dann die Array- pop()Funktion, die das letzte Element aus dem konvertierten Array zurückgibt.

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);

Shapon Pal
quelle
5

Die anderen Antworten machen es mir zu kompliziert.

let animals = {
  a: 'dog',
  b: 'cat',
  c: 'bird'
}

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
irgendwo anders
quelle
3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };  
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c'   
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot'
Reha Ozenc
quelle
1

Sie können auch die folgende Object.values()Methode verwenden:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"
AshNaz87
quelle
0

Objekt in JavaScript zuordnen . Das ist jetzt schon ungefähr 3 Jahre alt. Diese Kartendatenstruktur behält die Reihenfolge bei, in der Elemente eingefügt werden. Wenn Sie das letzte Element abrufen, wird das neueste Element in die Karte eingefügt

vatsa
quelle
0

Lass objdein Objekt sein. Exec:

(_ => _[Object.keys(_).pop()])( obj )
Diogo PEREIRA MARQUES
quelle
0

Wenn Sie meinen, den letzten Schlüssel alphabetisch zu erhalten, können Sie (garantiert):

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var keys = Object.keys(obj);
keys.sort();
var lastkey = keys.pop() // c
var lastvalue = obj[lastkey] // 'carrot'
Raphael PICCOLO
quelle