web-dev-qa-db-fra.com

JavaScript: Obtenir le premier et unique nom de propriété de l'objet

Si je veux énumérer les propriétés d'un objet et que je veux ignorer les prototypes, j'utiliserais:

var instance = { ... };

for (var prop in instance) {
    if (instance.hasOwnProperty(prop)) {
        ... 
    }
}

Que se passe-t-il si instance n'a qu'une seule propriété et que je souhaite obtenir le nom de cette propriété? Y a-t-il un moyen plus facile que de faire ceci:

var instance = { id: "foobar" };

var singleMember = (function() {
    for (var prop in instance) {
        if (instance.hasOwnProperty(prop)) {
            return prop;
        }
    }
})();
34
FoobarisMaximus

Peut-être que Object.keys peut travailler pour vous. Si sa longueur renvoie 1, vous pouvez utiliser yourObject[Objects.keys[0]] pour obtenir la seule propriété de l'objet. MDN-link affiche également une fonction personnalisée à utiliser dans les environnements sans la méthode keys1. Code comme ceci:

var obj = {foo:'bar'}, 
    kyz = Object.keys(obj);
if (kyz.length === 1){
   alert(obj[kyz[0]]); //=> 'bar'
} else {
  /* loop through obj */
}

1 Certains navigateurs plus anciens ne supportent pas Object.keys. Le lien MDN fournit le code pour le faire fonctionner dans ces navigateurs aussi. Voir en-tête Compatibilité dans la susdite page MDN

44
KooiInc

Forme la plus courte:

instance[Object.keys(instance)[0]];

ES6 + fonction:

let first = v => v[Object.keys(v)[0]];

Utilisez la fonction:

first({a:'first', b:'second'}) // return 'first'
11
Isaac Han

Malheureusement, il n’existe pas de fonction "Liste de propriétés" intégrée, et il n’existe certainement pas de "getFirstProperty" (d’autant plus qu’il n’ya aucune garantie qu’une propriété soit systématiquement "première").

Je pense que vous feriez mieux d'écrire une fonction comme celle-ci:

/**
 * A means to get all of the keys of a JSON-style object.
 * @param obj The object to iterate
 * @param count maximum length of returned list (defaults to Infinity).
 */
function getProperties( obj, count )
{
    if( isNaN( count ) ) count = Infinity
    var keys = []
    for( var it in obj )
    {
        if( keys.length > count ) break;
        keys.Push( it );
    }
    return keys;
}

Ensuite, vous pouvez accéder au nom si:

instance = {"foo":"bar"}
// String() on an array of < 2 length returns the first value as a string
// or "" if there are no values.
var prop = String(getProperties(instance, 1));
2
cwallenpoole

Bien que ma réponse soit rejetée, il est toujours intéressant de savoir qu'il existe non comme l'ordre des clés dans un objet javascript. Par conséquent, en théorie, tout code reposant sur des valeurs itératives peut être incohérent. Une approche pourrait consister à créer un objet et à définir un paramètre définissant le comptage, le classement, etc., ainsi que des méthodes permettant d’accéder à ces champs. Cela pourrait être fait dans les navigateurs modernes.

Donc, pour répondre à votre question, en général, votre approche est encore la plupart des navigateurs closs. Vous pouvez itérer en utilisant lodash ou tout autre framework moderne qui vous cachera la complexité "hasOwnProperty". À partir du 15 août, Object.keys peut être accepté comme navigateur universel et universel. Après tout IE8 s'est passé il y a des années. Il y a tout de même des cas où vous ne stockez pas tous les jeux de clés dans un tableau. Mais j'irais avec Object.keys - c'est plus flexible par rapport à l'itération.

1
shabunc
  var foo = {bar: 1};
  console.log(Object.keys(foo).toString());

qui va imprimer la ficelle

"bar"
0
mewc

C'est un vieux post, mais j'ai fini par écrire la fonction d'assistance suivante basée sur Object.keys () .

Il retourne les key et value de la première propriété.

getFirstPropertyKeyAndValue(sourceObject) {
    var result = null;
    var ownProperties = Object.keys(sourceObject);
    if (ownProperties.length > 0) {
      if (ownProperties.length > 1) {
        console.warn('Getting first property of an object containing more than 1 own property may result in unexpected results. Ordering is not ensured.', sourceObject);
      }
      var firstPropertyName = ownProperties[0];
      result = {key: firstPropertyName, value: sourceObject[firstPropertyName]};
    }
    return result;
  }
0
andrew