2010-11-30 31 views
61

Si tengo un objeto como:conseguir el último elemento de un objeto Javascript

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

Si no sé de antemano que la lista sube a 'c', que no sea un bucle a través del objeto, ¿Hay alguna manera de obtener el último elemento en el objeto (por ejemplo, 'carrot')?

+0

Esa es una buena pregunta. Además, ¿cómo se puede verificar la vacuidad de los objetos, que no sean bucles sobre ellos? –

+1

** propiedad ** no "artículo". y no, el orden de propiedad no está definido. –

+0

la última propiedad * valor * quiere decir, yo diría – KooiInc

Respuesta

52

No. El pedido no está garantizado en JSON ni en la mayoría de las otras estructuras de datos clave-valor, por lo que el último artículo podría ser carrot y en otras ocasiones banana y así sucesivamente. Si necesita para confiar en el pedido, 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 elemento nth del objeto.

+1

Como una expansión en esta respuesta completamente correcta. Los objetos no son matrices, incluso si creas una matriz asociativa en JS usando los marcadores de matriz '[]' es realmente un objeto. JS no tiene matrices asociativas como tales, las matrices tienen acceso indexado y secuencia; los objetos tienen acceso de propiedad asociativo, no secuencial. – Orbling

+1

Sé que no se garantiza que tengan un pedido, 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. Claramente, la respuesta a la pregunta es "no". :) – sprugman

+1

@sprugman: No en Chrome. Ha habido un debate acalorado y acalorado sobre este tema: http://code.google.com/p/v8/issues/detail?id=164 –

5

Utilice una matriz, no un objeto literal, si el orden es importante.

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

O algo así

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

O incluso ..

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

Las claves para dict no están garantizados en absoluto estar en orden.

+0

+1 para una forma colorida de enseñar el ABC. – paqogomez

5

En cuanto a la ordenación de las propiedades de los objetos en Javascript, sólo un enlace a esta respuesta:

Elements order in a "for (… in …)" loop

Específicamente:

Todas las implementaciones modernas de ECMAScript iterar a través de objetos propiedades en el orden en que se definieron

Así que cualquier otra respuesta aquí es correcta, no hay un orden oficial garantizado para las propiedades del objeto. Sin embargo, en la práctica existe (salvo errores que naturalmente pueden arruinar incluso el comportamiento oficialmente especificado).

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

Todavía, en este momento no escribiría el código alrededor de esto, sobre todo porque no hay herramientas integradas para ayudar a lidiar con el orden de propiedad del objeto. Podrías escribir el tuyo propio, pero al final siempre estarías recorriendo cada propiedad de un objeto para determinar su posición.

Como tal, la respuesta a su pregunta es No, no hay otra manera que pasar por un objeto.

+0

Como dices, definitivamente no confiaría en ningún pedido de enumeración de propiedades de objetos. Para empezar, las nuevas implementaciones de ECMAScript no están obligadas a seguir este estándar de facto, por lo que el código que depende de un pedido en particular no es a prueba de futuro; Además, no todos los navegadores actuales se comportan de la misma manera. Consulte esta discusión en el rastreador de errores de Chrome: http://code.google.com/p/v8/issues/detail?id=164. Finalmente, no esperaría que la especificación ECMAScript estandarice esto en el corto plazo. –

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

fuente: http://javascriptweblog.wordpress.com

+2

"que no sea un bucle a través del objeto" – sprugman

+1

Para aquellos que necesitan obtener la primera clave de un objeto puede seguir el procedimiento anterior pero con esto: 'for (firstProperty en myObj) {break; }; ' – panosru

136

Sí, hay una manera de utilizar Object.keys(obj).Se explica en this page:

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

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

Este debería haber sido el aceptado, que' Object.keys' funciona increíble. Solo tengo que encontrar la manera de hacerlo funcionar en IE8 y 7, porque eso solo apareció en IE9. – RaphaelDDL

+0

Estaba agrupando por fecha con _.groupBy en el lado del servidor (nodo). Trabaja como un encanto, no sé por qué la gente dice que no hay garantía sobre los pedidos. – BigDong

+0

Gracias, buena respuesta. –

11

última = Object.keys (obj) [Object.keys (obj) .length-1];

donde obj es el objeto

+0

Esto obtiene la última clave (''c'' en este caso) pero la pregunta está redactada de manera que implica que el asker está buscando el último valor (' 'carrot''). Esto tampoco agrega nada que no esté cubierto por [la respuesta de Kristina Stefanova] (https://stackoverflow.com/a/16590272/399105) – bmaupin

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' 
0

Map object in JavaScript . Esto ya tiene alrededor de 3 años ahora. Esta estructura de datos de mapa conserva el orden en que se insertan los elementos. Con este último punto de recuperación en realidad resultar en último elemento insertado en el mapa

4

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

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

Cuestiones relacionadas