obtener el último elemento de un objeto javascript

93

Si tengo un objeto como:

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

Si no sé de antemano que la lista sube a 'c', además de recorrer el objeto, ¿hay alguna forma de obtener el último elemento del objeto (por ejemplo 'carrot')?

sprugman
fuente
Buena pregunta. Además, ¿cómo se puede verificar que los objetos estén vacíos, además de hacer un bucle sobre ellos?
Lukas Eder
2
propiedad no "artículo". y no, el orden de propiedad no está definido.
Consulta gratuita
el último valor de propiedad que quiere decir, yo diría
KooiInc

Respuestas:

65

No. El orden no está garantizado en JSON y la mayoría de las otras estructuras de datos de valor-clave, por lo tanto, el último elemento a veces podría ser carroty en otras ocasiones, bananay así sucesivamente. Si necesita confiar en los pedidos, su mejor opción es ir con matrices. El poder de las estructuras de datos clave-valor radica en acceder a los valores por su keys, no en poder obtener el nthelemento del objeto.

Alex
fuente
1
Como una expansión de esta respuesta totalmente correcta. Los objetos no son matrices, incluso si crea una matriz asociativa en JS utilizando los marcadores de matriz [], es realmente un objeto. JS no tiene matrices asociativas como tales, las matrices tienen acceso y secuencia indexados; los objetos tienen acceso de propiedad asociativa, no secuencial.
Orbling
3
Sé que no se garantiza que tengan un orden, pero si tengo control sobre la creación del objeto, en términos prácticos, puedo asegurarme de que estén en un orden específico. Sin embargo, es evidente que la respuesta a la pregunta es "no". :)
sprugman
2
@sprugman: No en Chrome. Se ha producido un acalorado debate sobre este tema: code.google.com/p/v8/issues/detail?id=164
Tim Down
217

Sí, hay una forma de usar Object.keys(obj). Se explica en esta página :

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

Si desea obtener el valor del último objeto, puede hacer esto:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Kristina Stefanova
fuente
8
Este debería haber sido el aceptado, Object.keysfunciona de maravilla. Solo tengo que encontrar una manera de que funcione en IE8 y 7, porque eso se mostró solo en IE9.
RaphaelDDL
4
puede hacerlo directamente con Object.values ​​(fruitObject) que devolverá los valores en lugar de las claves, y luego hacer un pop () en su matriz para devolver el último elemento.
Yvon Huynh
4
La primera respuesta aquí es la respuesta correcta. Intenté usar Object.keysuna y otra vez solo para descubrir que las propiedades estaban ordenadas al azar. El orden de propiedad real es diferente de lo que se muestra cuando se registra en la consola de su navegador. Cuando se inicia sesión en la consola del navegador, las propiedades se reordenan automáticamente y se muestran alfabéticamente / numéricamente, lo que definitivamente causa cierta confusión.
kennsorr
1
La especificación JS no garantiza el orden de la clave y puede variar entre diferentes implementaciones (motores). Por lo tanto, no es posible garantizar el orden de inserción para el objeto generado aleatoriamente (con clave). El Array es un tipo de Objeto donde la clave es un índice numérico para garantizar el orden de inserción entre otras propiedades útiles.
Ethan Doh
1
Buen Señor, la gente tuvo dificultades para hacer desarrollo web en 2010-2013 ...
Merc
22
last = Object.keys(obj)[Object.keys(obj).length-1];

donde obj es tu objeto

user3282891
fuente
1
Esto obtiene la última clave ( 'c'en este caso) pero la pregunta está redactada de una manera que implica que el autor de la pregunta está buscando el último valor ( 'carrot'). Esto tampoco agrega nada que no esté cubierto por la respuesta de Kristina Stefanova
bmaupin
13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

fuente: http://javascriptweblog.wordpress.com

Jorge
fuente
2
"aparte de recorrer el objeto"
sprugman
2
Para aquellos que necesitan obtener la primera clave de un objeto, pueden seguir el camino anterior pero con esto:for (firstProperty in myObj) { break; };
panosru
10

Solución utilizando la sintaxis de asignación de desestructuración de ES6:

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

ollazarev
fuente
5

En cuanto al orden de las propiedades del objeto en Javascript, solo vincularé a esta respuesta:

Orden de los elementos en un bucle "for (... in ...)"

Específicamente:

Todas las implementaciones modernas de ECMAScript iteran a través de las propiedades del objeto en el orden en que fueron definidas

Entonces, todas las demás respuestas aquí son correctas, no hay un orden oficial garantizado para objetar propiedades. Sin embargo, en la práctica lo hay (salvo cualquier error que, naturalmente, pueda arruinar incluso el comportamiento establecido en piedra oficialmente especificado).

Además, es probable que el orden de enumeración de facto de las propiedades de los objetos se codifique en futuras especificaciones de EMCAScript.

Aún así, en este momento no escribiría código sobre esto, principalmente porque no hay herramientas integradas para ayudar a lidiar con el orden de las propiedades de los objetos. Podrías escribir el tuyo propio, pero al final siempre estarías recorriendo cada propiedad en un objeto para determinar su posición.

Como tal, la respuesta a su pregunta es No , no hay forma más que recorrer un objeto.

MooGoo
fuente
Como usted dice, definitivamente no confiaría en ningún orden para la enumeración de propiedades de objetos. Para empezar, las nuevas implementaciones de ECMAScript no tienen la obligación de seguir este estándar de facto, por lo que el código que se basa en un orden en particular no está preparado para el futuro; Además, no todos los navegadores actuales se comportan igual. Vea esta discusión sobre el rastreador de errores de Chrome: code.google.com/p/v8/issues/detail?id=164 . Finalmente, no esperaría que la especificación ECMAScript estandarice esto en el corto plazo.
Tim Down
5

Use una matriz, no un objeto literal, si el orden importa.

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

O algo como

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

O incluso..

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

dictNo se garantiza en absoluto que las claves estén en orden.

meder omuraliev
fuente
5

Puedes probar esto. Esto almacenará el último artículo. Aquí es necesario convertir obj en una matriz. Luego use la pop()función de matriz que devolverá el último elemento de la matriz convertida.

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

Shapon Pal
fuente
5

Las otras respuestas me lo complican demasiado.

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

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
en algún lugar
fuente
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
fuente
1

También puedes usar el Object.values()método:

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

Objeto de mapa en JavaScript . Esto ya tiene unos 3 años. Esta estructura de datos de mapa conserva el orden en que se insertan los elementos. Con esta recuperación, el último elemento dará como resultado el último elemento insertado en el mapa

vatsa
fuente
0

Deja que objsea ​​tu objeto. Ejecutivo:

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

si te refieres a obtener la última clave alfabéticamente, puedes (garantizado):

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'
Rafael PICCOLO
fuente