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

93

Si j'ai un objet comme:

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

Si je ne sais pas à l'avance que la liste monte à «c», autre que la boucle à travers l'objet, y a-t-il un moyen d'obtenir le dernier élément de l'objet (par exemple 'carrot')?

sprugman
la source
C'est une bonne question. En outre, comment vérifier le vide des objets, autre que de les parcourir en boucle?
Lukas Eder
2
propriété non "article". et non, l'ordre des propriétés n'est pas défini.
Consultation gratuite
la dernière valeur de propriété qu'il veut dire, je dirais
KooiInc

Réponses:

65

Non. L'ordre n'est pas garanti dans JSON et la plupart des autres structures de données clé-valeur, donc le dernier élément peut parfois être carrotet à d'autres moments être bananaet ainsi de suite. Si vous devez vous fier à la commande, le mieux est d'utiliser des tableaux. Le pouvoir des structures de données clé-valeur réside dans l'accès aux valeurs par leur keys, pas dans la capacité d'obtenir l' nthélément de l'objet.

Alex
la source
1
Comme une extension de cette réponse tout à fait correcte. Les objets ne sont pas des tableaux, même si vous créez un tableau associatif dans JS en utilisant les marqueurs de tableau, []c'est vraiment un objet. JS n'a pas de tableaux associatifs en tant que tels, les tableaux ont un accès et une séquence indexés; les objets ont un accès aux propriétés associatif, non séquentiel.
Orbling
3
Je sais qu'ils ne sont pas garantis d'avoir un ordre, mais si j'ai le contrôle sur la création de l'objet, en termes pratiques, je peux m'assurer qu'ils sont dans un ordre spécifique. De toute évidence, la réponse à la question est «non». :)
sprugman
2
@sprugman: pas dans Chrome. Un long débat houleux fait rage sur ce sujet: code.google.com/p/v8/issues/detail?id=164
Tim Down
217

Oui, il existe un moyen d'utiliser Object.keys(obj). Il 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 souhaitez obtenir la valeur du dernier objet, vous pouvez le faire:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Kristina Stefanova
la source
8
Celui-ci aurait dû être celui accepté, qui Object.keysfonctionne à merveille. Je dois juste trouver un moyen de le faire fonctionner sur IE8 et 7, car cela n'apparaissait que sur IE9.
RaphaelDDL
4
vous pouvez le faire directement avec Object.values ​​(fruitObject) qui renverra les valeurs au lieu des clés, puis faire un pop () dans votre tableau pour renvoyer le dernier élément.
Yvon Huynh
4
La première réponse ici est la bonne réponse. J'ai essayé d'utiliser Object.keysencore et encore pour constater que les propriétés étaient en fait classées au hasard. L'ordre réel des propriétés est différent de ce qui est affiché lors de la connexion à la console de votre navigateur. Lorsqu'elles sont connectées à la console du navigateur, les propriétés sont automatiquement réorganisées et affichées par ordre alphabétique / numérique, ce qui entraîne définitivement une certaine confusion.
kennsorr
1
La spécification JS ne garantit pas l'ordre de la clé et peut varier entre différentes implémentations (moteurs). Par conséquent, il n'est pas possible de garantir l'ordre d'insertion pour un objet généré aléatoirement (à clé). Le tableau est un type d'objet où la clé est un index numérique pour garantir l'ordre d'insertion parmi d'autres propriétés utiles.
Ethan Doh
1
Les bons seigneurs ont eu du mal à faire du développement Web en 2010-2013 ...
Merc
22
last = Object.keys(obj)[Object.keys(obj).length-1];

où obj est votre objet

user3282891
la source
1
Cela obtient la dernière clé ( 'c'dans ce cas) mais la question est formulée d'une manière qui implique que le demandeur recherche la dernière valeur ( 'carrot'). Cela n'ajoute pas vraiment quoi que ce soit qui ne soit déjà couvert par la réponse de Kristina Stefanova
bmaupin
13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

source: http://javascriptweblog.wordpress.com

George
la source
2
"autre que la boucle à travers l'objet"
sprugman
2
Pour ceux qui ont besoin d'obtenir la première clé d'un objet peuvent suivre le chemin ci-dessus mais avec ceci:for (firstProperty in myObj) { break; };
panosru
10

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

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

ollazarev
la source
5

En ce qui concerne l'ordre des propriétés des objets en Javascript, je vais juste faire un lien vers cette réponse:

Ordre des éléments dans une boucle "for (… in…)"

Plus précisément:

Toutes les implémentations modernes d'ECMAScript parcourent les propriétés d'objet dans l'ordre dans lequel elles ont été définies

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

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

Pourtant, pour le moment, je n'écrirais pas de code autour de cela, principalement parce qu'il n'y a pas d'outils intégrés pour aider à gérer l'ordre des propriétés des objets. Vous pouvez écrire le vôtre, mais à la fin, vous bouclez toujours sur chaque propriété d'un objet pour déterminer sa position.

En tant que tel, la réponse à votre question est non , il n'y a pas d'autre moyen que de parcourir un objet.

MooGoo
la source
Comme vous le dites, je ne me fierais certainement à aucun ordre d'énumération des propriétés d'objet. Pour commencer, les nouvelles implémentations d'ECMAScript n'ont aucune obligation de suivre cette norme de facto, de sorte que le code reposant sur un ordre particulier n'est pas à l'épreuve du temps; De plus, tous les navigateurs actuels ne se comportent pas de la même manière. Consultez cette discussion sur l'outil de suivi des bogues Chrome: code.google.com/p/v8/issues/detail?id=164 . Enfin, je ne m'attendrais pas à ce que la spécification ECMAScript standardise cela de si tôt.
Tim Down
5

Utilisez un tableau, pas 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 dictne sont pas du tout garanties d'être en ordre.

meder omuraliev
la source
5

Vous pouvez essayer ceci. Cela stockera le dernier élément. Ici, besoin de convertir obj en tableau. Ensuite, utilisez la pop()fonction de tableau qui retournera le dernier élément du tableau converti.

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

Shapon Pal
la source
5

Les autres réponses me compliquent trop.

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

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
somebodysomewhere
la source
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
la source
1

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

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

Objet cartographique en JavaScript . Cela a déjà environ 3 ans maintenant. Cette structure de données cartographiques 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 sera en fait inséré dans la carte

vatsa
la source
0

Laissez objêtre votre objet. Exec:

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

si vous voulez dire obtenir la dernière clé par ordre alphabétique, vous pouvez (garanti):

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
la source