web-dev-qa-db-fra.com

Accéder aux propriétés non numériques des objets par index?

Si j'ai un tableau comme celui-ci:

var arr = ['one','two','three'];

Je peux accéder à différentes parties en faisant ceci:

console.log(arr[1]);

Comment puis-je accéder aux propriétés des objets par leur ordre plutôt que par la clé?

Exemple:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

Comment pourrais-je obtenir la première propriété pour chaque objet - "quelque chose" de obj et "même" de jbo– sans utiliser explicitement le nom de la propriété?

Maintenant, quelques-uns d'entre vous semblent penser que je suis après quelque chose comme:

console.log(obj['something']);

Ce n'est pas le cas, je cherche spécifiquement à cibler l'index, tout comme le premier exemple - si c'est possible.

58
daryl

"Je cherche spécifiquement à cibler l'index, tout comme le premier exemple - si c'est possible."

Non, ce n'est pas possible.

Le plus proche que vous puissiez obtenir est d'obtenir un tableau des clés de l'objet et de l'utiliser:

var keys = Object.keys( obj );

... mais rien ne garantit que les clés seront rendues dans l'ordre que vous avez défini. Cela pourrait donc ressembler à:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'
90
user113716

La seule façon pour moi d’y parvenir est de créer une méthode qui vous donne la propriété en utilisant Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

Démo: http://jsfiddle.net/UmkVn/

Il serait possible d'étendre cela à tous les objets en utilisant Object.prototype; mais ce n'est généralement pas recommandé.

Au lieu de cela, utilisez un assistant de fonction:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6
39
0x499602D2
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

Modifier:

"Je cherche spécifiquement à cibler l'indice, comme dans le premier exemple - si c'est possible."

En réalité, l'index est la clé. Si vous souhaitez stocker la position d'une clé, vous devez créer un objet personnalisé pour gérer cela.

3
cuzzea

Vous pouvez utiliser la méthode Object.values() si vous ne voulez pas utiliser la Object.keys()

Par opposition à la méthode Object.keys() qui renvoie un tableau des propriétés énumérables propres à un objet donné, par exemple:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

Souhaitez imprimer le tableau suivant:

[ 'a', 'b', 'c' ]

La méthode Object.values() renvoie un tableau de la propriété énumérable propre à un objet donné values.

Donc, si vous avez le même objet mais utilisez plutôt des valeurs,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

Vous obtiendrez le tableau suivant:

[ 'somestring', 42, false ]

Donc, si vous voulez accéder au object1.b, mais en utilisant un index, vous pouvez utiliser:

Object.values(object1)[1] === 42

Vous pouvez en savoir plus sur cette méthode ici .

3
Arthur Senna

Obtenez le tableau de clés, inversez-le, puis lancez votre boucle

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }
0
Kareem

en jquery vous pouvez faire ceci:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);
0

Si vous n'êtes pas sûr que Object.keys () va vous retourner les clés dans le bon ordre, vous pouvez plutôt essayer cette logique

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.Push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
0
Thiago Loddi