web-dev-qa-db-fra.com

obtenir le dernier élément d'un objet javascript

Si j'ai un objet comme: 

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

Si je ne sais pas à l'avance que la liste monte en "c", mis à part la lecture en boucle de l'objet, existe-t-il un moyen d'obtenir le dernier élément de l'objet (par exemple, 'carrot')?

74
sprugman

Non, l'ordre n'est pas garanti dans JSON ni dans la plupart des autres structures de données clé-valeur. Le dernier élément peut donc parfois être carrot et à d'autres moments banana et ainsi de suite. Si vous avez besoin de compter sur la commande, votre meilleur choix est d’utiliser des tableaux. La puissance des structures de données clé-valeur réside dans l'accès aux valeurs par leur keys, et non dans l'obtention de l'élément nth de l'objet.

53
Alex

Oui, il existe un moyen d'utiliser Object.keys(obj). C'est expliqué dans cette page :

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

Si vous voulez obtenir la valeur du dernier objet, vous pouvez faire ceci:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
168
last = Object.keys(obj)[Object.keys(obj).length-1];

où obj est ton objet

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

source: http://javascriptweblog.wordpress.com

12
George

Solution utilisant la syntaxe d'attribution de déstructuration de ES6:

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

6
ollazarev

En ce qui concerne la commande des propriétés des objets en Javascript, je vais simplement vous relier à cette réponse:

L'ordre des éléments dans une boucle "pour (… dans ...)"

Plus précisément:

Toutes les implémentations modernes de ECMAScript itérer dans l'objet propriétés dans l'ordre dans lequel ils ont été définis

Donc, toutes les autres réponses sont correctes, il n'y a pas d'ordre garanti officiel pour objecter des propriétés. Cependant, dans la pratique, il y en a (à l'exception des bugs qui peuvent naturellement gâcher le comportement incrusté même officiellement spécifié).

De plus, l'ordre d'énumération de facto des propriétés de l'objet sera probablement codifié dans les futures spécifications EMCAScript.

Cependant, pour le moment, je n’écrirais pas de code à ce sujet, principalement parce qu’il n’existait pas d’outil intégré permettant de gérer l’ordre des propriétés des objets. Vous pourriez écrire la vôtre, mais au final, vous feriez toujours une boucle sur chaque propriété d'un objet pour déterminer sa position. 

En tant que telle, la réponse à votre question est Non, il n’ya pas d’autre moyen que de parcourir en boucle un objet.

5
MooGoo

Utilisez un tableau et non un objet littéral, si l'ordre est important. 

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

Ou quelque chose comme

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

Ou même..

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

Les clés pour dict ne sont pas du tout garanties d'être en ordre.

5
meder omuraliev
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'
3
Reha Ozenc

Vous pouvez également utiliser la méthode Object.values():

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

Soit obj votre objet. Exec:

(_ => _[Object.keys(_).pop()])( obj )
0

Objet de la carte en JavaScript . Cela fait déjà environ 3 ans. Cette structure de données de carte conserve l'ordre dans lequel les éléments sont insérés. Avec cette récupération du dernier élément, le dernier élément inséré dans la carte

0
vatsa