Comment accéder à la première propriété d’un object en Javascript?

Existe-t-il un moyen élégant d’accéder à la première propriété d’un object

  1. où vous ne connaissez pas le nom de vos propriétés
  2. sans utiliser de boucle comme for .. in ou jQuery’s $.each

Par exemple, je dois accéder à l’object foo1 sans connaître le nom de foo1:

 var example = { foo1: { /* stuff1 */}, foo2: { /* stuff2 */}, foo3: { /* stuff3 */} }; 

 var obj = { first: 'someVal' }; obj[Object.keys(obj)[0]]; //returns 'someVal' 

En utilisant cela, vous pouvez également accéder à d’autres propriétés par index. Soyez conscient que! Object.keys ordre de retour d’ Object.keys n’est pas garanti par ECMAScript, mais officieusement par toutes les principales implémentations de navigateurs, veuillez lire https://stackoverflow.com/a/23202095 pour plus de détails.

Essayez le for … in loop et casser après la première itération:

 for (var prop in object) { // object[prop] break; } 

Utilisez Object.keys pour obtenir un tableau des propriétés sur un object. Exemple:

 var example = { foo1: { /* stuff1 */}, foo2: { /* stuff2 */}, foo3: { /* stuff3 */} }; var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable) 

Documentation et shim multi-navigateurs fournis ici . Un exemple de son utilisation peut être trouvé dans une autre de mes réponses ici .

Edit : pour plus de clarté, je veux juste faire écho à ce qui a été correctement indiqué dans d’autres réponses: l’ordre des clés dans les objects javascript n’est pas défini.

Une version à une règle:

 var val = example[function() { for (var k in example) return k }()]; 

Il n’y a pas de “première” propriété. Les clés d’object ne sont pas ordonnées.

Si vous les passez en boucle avec pour (var foo in bar) vous les obtiendrez dans un certain ordre, mais cela pourrait changer à l’avenir (surtout si vous ajoutez ou supprimez d’autres clés).

Vous pouvez également faire des Object.values(example)[0] .

Non. Un littéral d’object, tel que défini par MDC, est:

une liste de zéro ou plusieurs paires de noms de propriétés et de valeurs associées d’un object, entourées d’accolades ({}).

Par conséquent, un littéral d’object n’est pas un tableau et vous pouvez uniquement accéder aux propriétés en utilisant leur nom explicite ou une boucle for utilisant le mot clé in .

Je ne vous recommande pas d’utiliser Object.keys car ce n’est pas supporté par les anciennes versions d’IE. Mais si vous en avez vraiment besoin, vous pouvez utiliser le code ci-dessus pour garantir la compatibilité arrière:

 if (!Object.keys) { Object.keys = (function () { var hasOwnProperty = Object.prototype.hasOwnProperty, hasDontEnumBug = !({toSsortingng: null}).propertyIsEnumerable('toSsortingng'), dontEnums = [ 'toSsortingng', 'toLocaleSsortingng', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ], dontEnumsLength = dontEnums.length; return function (obj) { if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); var result = []; for (var prop in obj) { if (hasOwnProperty.call(obj, prop)) result.push(prop); } if (hasDontEnumBug) { for (var i=0; i < dontEnumsLength; i++) { if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); } } return result; }})()}; 

Fonctionnalité Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5

Plus d'infos: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

Mais si vous n'avez besoin que du premier, nous pourrions vous proposer une solution plus courte, comme:

 var data = {"key1":"123","key2":"456"}; var first = {}; for(key in data){ if(data.hasOwnProperty(key)){ first.key = key; first.content = data[key]; break; } } console.log(first); // {key:"key",content:"123"} 

Solution avec la bibliothèque lodash :

 _.find(example) // => {name: "foo1"} 

mais il n’y a aucune garantie sur l’ordre de stockage interne des propriétés de l’object car il dépend de l’implémentation de la machine virtuelle JavaScript.

Cela a été couvert ici avant.

Le concept de first ne s’applique pas aux propriétés d’object, et l’ordre d’une boucle for … in n’est pas garanti par les spécifications, mais dans la pratique, FIFO est fiable sauf pour le chrome ( rapport de bogue ). Prenez vos décisions en conséquence.

Si vous devez accéder à “la première propriété d’un object”, cela peut signifier que votre logique présente un problème. L’ordre des propriétés d’un object ne devrait pas avoir d’importance.

Utilisez un tableau au lieu d’un object (crochets).

 var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}]; var fist = example[0]; 

Notez que vous perdez les identifiants “foo”. Mais vous pouvez append une propriété name aux objects contenus:

 var example = [ {name: 'foo1', /* stuff1 */}, {name: 'foo2', /* stuff2 */}, {name: 'foo3', /* stuff3 */} ]; var whatWasFirst = example[0].name; 

Une raison de ne pas le faire?

 > example.map(x => x.name); (3) ["foo1", "foo2", "foo3"]