ottenere l'ultimo elemento in un oggetto javascript


93

Se ho un oggetto come:

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

Se non so in anticipo che l'elenco va fino a "c", oltre a scorrere l'oggetto, c'è un modo per ottenere l'ultimo elemento nell'oggetto (ad esempio 'carrot')?


Questa è una buona domanda. Inoltre, come si può controllare il vuoto degli oggetti, a parte il loop su di essi?
Lukas Eder

2
proprietà non "oggetto". e no, l'ordine delle proprietà non è definito.
Consulenza gratuita

l'ultimo valore della proprietà che significa, direi
KooiInc

Risposte:


65

No. L'ordine non è garantito in JSON e nella maggior parte delle altre strutture di dati chiave-valore, quindi l'ultimo elemento potrebbe a volte essere carrote altre volte essere bananae così via. Se hai bisogno di fare affidamento sull'ordinazione, la soluzione migliore è scegliere gli array. Il potere delle strutture dati chiave-valore risiede nell'accesso ai valori tramite loro keys, non nell'essere in grado di ottenere l' nthelemento dell'oggetto.


1
Come espansione di questa risposta del tutto corretta. Gli oggetti non sono array, anche se crei un array associativo in JS utilizzando i marcatori di array [], è in realtà un oggetto. JS non ha array associativi in ​​quanto tali, gli array hanno accesso e sequenza indicizzati; gli oggetti hanno accesso alla proprietà associativa, non sequenziale.
Orbling

3
So che non è garantito che abbiano un ordine, ma se ho il controllo sulla creazione dell'oggetto, in termini pratici, posso assicurarmi che siano in un ordine specifico. Chiaramente, la risposta alla domanda, però, è "no". :)
sprugman

2
@sprugman: non in Chrome. Un lungo dibattito acceso infuria su questo argomento: code.google.com/p/v8/issues/detail?id=164
Tim Down

217

Sì, c'è un modo per usare Object.keys(obj). È spiegato in questa pagina :

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

Se vuoi ottenere il valore dell'ultimo oggetto, puoi farlo:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"

8
Questo avrebbe dovuto essere quello accettato, Object.keysfunziona alla grande. Devo solo trovare un modo per farlo funzionare su IE8 e 7, perché è apparso solo su IE9.
RaphaelDDL

4
potresti farlo direttamente con Object.values ​​(fruitObject) che restituirà i valori invece delle chiavi, e quindi fare un pop () al tuo array per restituire l'ultimo elemento.
Yvon Huynh

4
La prima risposta qui è la risposta corretta. Ho provato a utilizzare Object.keyspiù e più volte solo per scoprire che le proprietà erano effettivamente ordinate in modo casuale. L'ordine effettivo delle proprietà è diverso da ciò che viene visualizzato quando si accede alla console del browser. Quando si accede alla console del browser, le proprietà vengono automaticamente riordinate e visualizzate in ordine alfabetico / numerico, il che crea sicuramente un po 'di confusione.
kennsorr

1
Le specifiche JS non garantiscono l'ordine della chiave e possono variare tra le diverse implementazioni (motori). Quindi non è possibile garantire l'ordine di inserimento per oggetti generati casualmente (con chiave). L'array è un tipo di oggetto in cui la chiave è un indice numerico per garantire l'ordine di inserimento tra le altre proprietà utili.
Ethan Doh

1
Le persone del buon Dio hanno avuto difficoltà nello sviluppo web nel 2010-2013 ...
Merc

22
last = Object.keys(obj)[Object.keys(obj).length-1];

dove obj è il tuo oggetto


1
Questo ottiene l'ultima chiave ( 'c'in questo caso) ma la domanda è formulata in un modo che implica che il richiedente sta cercando l'ultimo valore ( 'carrot'). Anche questo non aggiunge davvero nulla che non sia già coperto dalla risposta di Kristina Stefanova
bmaupin

13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

fonte: http://javascriptweblog.wordpress.com


2
"
Diverso

2
Per coloro che hanno bisogno di ottenere la prima chiave di un oggetto può seguire la strada sopra ma con questo:for (firstProperty in myObj) { break; };
panosru

10

Soluzione che utilizza la sintassi di assegnazione destrutturante di ES6:

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


5

Per quanto riguarda l'ordine delle proprietà degli oggetti in Javascript, mi limiterò a collegarmi a questa risposta:

Gli elementi vengono ordinati in un ciclo "for (... in ...)"

Nello specifico:

Tutte le moderne implementazioni di ECMAScript ripetono le proprietà degli oggetti nell'ordine in cui sono state definite

Quindi ogni altra risposta qui è corretta, non esiste un ordine ufficiale garantito per le proprietà dell'oggetto. Tuttavia in pratica c'è (salvo eventuali bug che naturalmente possono rovinare anche il comportamento specificato ufficialmente nella pietra).

Inoltre, è probabile che l'ordine di enumerazione de facto delle proprietà degli oggetti venga codificato nelle specifiche EMCAScript future.

Tuttavia, in questo momento non scriverei codice intorno a questo, soprattutto perché non ci sono strumenti incorporati per aiutare a gestire l'ordine delle proprietà degli oggetti. Potresti scrivere il tuo, ma alla fine faresti sempre il loop su ogni proprietà in un oggetto per determinarne la posizione.

In quanto tale, la risposta alla tua domanda è No , non c'è altro modo oltre a scorrere un oggetto.


Come dici tu, sicuramente non farei affidamento su alcun ordine per l'enumerazione delle proprietà degli oggetti. Tanto per cominciare, le nuove implementazioni ECMAScript non sono obbligate a seguire questo standard de facto, quindi il codice che si basa su un ordine particolare non è a prova di futuro; inoltre, non tutti i browser attuali si comportano allo stesso modo. Vedi questa discussione sul bug tracker di Chrome: code.google.com/p/v8/issues/detail?id=164 . Infine, non mi aspetto che le specifiche ECMAScript lo standardizzino presto.
Tim Down

5

Usa un array, non un oggetto letterale, se l'ordine è importante.

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

O qualcosa di simile

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

O anche..

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

Non dictè affatto garantito che le chiavi siano in ordine.


5

Puoi provare questo. Questo memorizzerà l'ultimo elemento. Qui è necessario convertire obj in array. Quindi utilizzare la pop()funzione array che restituirà l'ultimo elemento dall'array convertito.

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


5

Le altre risposte mi complicano troppo.

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

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]

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'

1

Puoi anche usare il Object.values()metodo:

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

0

Oggetto mappa in JavaScript . Questo ha già circa 3 anni ormai. Questa struttura dei dati della mappa mantiene l'ordine in cui vengono inseriti gli elementi. Con questo recupero dell'ultimo elemento risulterà effettivamente l'ultimo elemento inserito nella mappa



0

se intendi ottenere l'ultima chiave in ordine alfabetico, puoi (garantito):

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.