web-dev-qa-db-fra.com

Quelle est la manière la plus efficace d'obtenir le premier élément d'un tableau associatif en JavaScript?

J'ai besoin de retirer le premier élément (en fait, juste la première clé) d'un tableau associatif assez grand en JavaScript. Voici comment je le fais actuellement (en utilisant jQuery):

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

Je suppose, 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 indique que vous n'êtes pas garanti 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ère 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.

43
Andrew Hedges

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

Mais, si vous voulez le premier à apparaître , 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 d'héritage?

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

Vous pouvez éviter d'avoir à créer une fonction en référençant la première entrée renvoyée par Object.keys():

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

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

var firstKey = Object.keys(data).sort()[0];
58
Erik Anderson

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

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