2008-10-07 11 views
35

Je dois obtenir seulement le premier élément (en fait, juste la première clé) d'un tableau associatif assez large en JavaScript. Voilà comment je le fais actuellement (en utilisant jQuery):Quel est le moyen le plus efficace d'obtenir le premier élément d'un tableau associatif en JavaScript?

getKey = function (data) { 
    var firstKey; 
    $.each(data, function (key, val) { 
     firstKey = key; 
     return false; 
    }); 
    return firstKey; 
}; 

juste deviner, mais je dirais qu'il doit y avoir une meilleure: façon (lire plus efficace) de le faire. Aucune suggestion? MISE À JOUR: Merci pour les réponses et commentaires perspicaces! J'avais oublié mon JavaScript 101, dans lequel la spécification dit que vous n'êtes pas garanti d'un ordre particulier dans un tableau associatif. Il est intéressant, cependant, que la plupart des navigateurs l'implémentent de cette façon. Je préférerais ne pas trier le tableau avant d'obtenir cette première clé, mais cela peut être inévitable compte tenu de mon cas d'utilisation.

+0

S'il s'agit d'un tableau associatif, comment savez-vous quel est le premier élément? –

+0

Je pense qu'il veut dire le premier élément qui a été inséré dans le tableau. –

+0

Si vous le souhaitez, vous devrez créer votre propre implémentation d'une pile. Les tableaux Assoc ne conservent aucune commande de clé. –

Répondre

41

Il n'y a pas vraiment un premier ou dernier élément dans des réseaux associatifs (à savoir des objets). Le seul ordre que vous pouvez espérer acquérir est l'ordre dans lequel les éléments ont été sauvegardés par l'analyseur - et aucune garantie de cohérence avec cela.

Mais, si vous voulez le premier à venir, la manière classique pourrait en fait être un peu plus facile:

function getKey(data) { 
    for (var prop in data) 
    return prop; 
} 

Vous voulez éviter les propriétés de l'héritage?

function getKey(data) { 
    for (var prop in data) 
    if (data.propertyIsEnumerable(prop)) 
     return prop; 
} 
+7

En fait, vous avez la garantie de la commande - pas par la spécification, mais simplement en raison de trop nombreux sites en fonction de l'ordre dans le passé. Fondamentalement, vous êtes assuré que pour (a dans b) .. couvrira chaque propriété énumérable dans b dans l'ordre exact où ils ont été ajoutés à l'objet lors de l'exécution. – olliej

+2

(J'ai manqué d'espace ci-dessus) L'exception à ceci est l'ordre que vous énumérez les propriétés dans la chaîne de prototype qui varie encore du navigateur au navigateur – olliej

+4

Quel est le problème avec 'Object.keys (data) [0]'? – cprn

2

En plus de la solution de Jonathan, nous pouvons également étendre les fonctionnalités de tableau par défaut:

Array.prototype.getKey = function() { 
    for (var prop in this) 
    if (this.propertyIsEnumerable(prop)) 
     return prop; 
} 
41

Vous pouvez éviter d'avoir à créer une fonction en faisant référence à la première entrée retournée de Object.keys():

var firstKey = Object.keys(data)[0]; 

Pour la première entrée d'une liste de clés triée, il suffit d'ajouter un appel à la méthode .sort():

var firstKey = Object.keys(data).sort()[0]; 
+1

c'est le meilleur je pense ... +1! – Riad

+4

Si vous avez besoin d'un support pour les anciens navigateurs, assurez-vous d'inclure ce polyfill dans votre script: https: //developer.mozilla.org/fr-fr/docs/Web/JavaScript/Références/Global_Objects/Objet/clés – 10basetom