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

88

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 clé?

Exemple:

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

Comment puis-je obtenir la première propriété pour chaque objet - "quelque chose" à partir objet "encore plus" de - jbosans 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.

daryl
la source
2
Qu'entendez-vous par "tableau d'objets". Un tableau est un objet. Voulez-vous dire simplement un objet qui n'est pas un tableau, ou voulez-vous dire un tableau d'objets. Et comment jQuery prend-il en compte votre question? Votre seul exemple de code illustre la partie que vous savez déjà faire. Que diriez-vous de donner un code qui illustre le problème .
user113716
@ Ӫ _._ Ӫ La raison pour laquelle j'ai tagué jQuery est pour obtenir un public plus large, j'ai pensé que quiconque connaissait jQuery devait avoir une compréhension des tableaux, pour ne pas contredire ma question, ce sont des manuels.
daryl
4
En fait, je dirais qu'il y a plus de gens "connaissant" jQuery et ne connaissant pas JavaScript que vice versa (au moins les gens qui connaissent JavaScript devraient être capables de comprendre jQuery facilement) .... et en ce qui concerne votre question réelle: Non, vous impossible d'accéder aux propriétés d'objec par index. Ils ne sont pas commandés.
Felix Kling
2
"... J'ai pensé que quiconque connaît jQuery doit avoir une compréhension des tableaux ..." Je ne parierais pas dessus.
user113716
1
@Brogrammer: cette question n'a rien à voir avec jQuery, donc la balise jQuery est inappropriée.
sortie

Réponses:

125

"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 il n'y a aucune garantie que les clés seront retournées dans l'ordre que vous avez défini. Cela pourrait donc ressembler à:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'
utilisateur113716
la source
6
Object.keys()pourrait être utilisé de manière fiable si vous connaissez le contenu de l'objet. Plus de détails ici: stackoverflow.com/questions/280713/…
cronoklee
3
La méthode Object.keys () retourne un tableau des propriétés énumérables propres à un objet donné, dans le même ordre que celui fourni par une boucle for ... in (la différence étant qu'une boucle for-in énumère les propriétés de la chaîne prototype comme bien). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey
6
tout est possible
Cas Bloem
48

La seule façon dont je peux penser à faire cela 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
0x499602D2
la source
1
C'est cool et fonctionne comme un charme! Pourquoi n'est-ce pas la réponse acceptée? Vous devriez probablement l'utiliser return this[Object.keys(this)[n]];pour le rendre générique.
cronoklee
3
Bonjour à partir de 2016, nous pensons toujours que cela devrait être la réponse acceptée. Great solution
mhodges
La raison pour laquelle ce n'est pas la réponse acceptée est que jusqu'à es6, l'ordre d'Object.keys n'est pas garanti. Ainsi, même si ce code fonctionne dans quelques moteurs JS, il n'est pas garanti de fonctionner dans tous. stackoverflow.com/questions/5525795/…
ptoinson
13

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

Contrairement à la Object.keys()méthode qui retourne un tableau des propres propriétés énumérables d'un objet donné, par exemple:

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

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

Imprime le tableau suivant:

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

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

Donc, si vous avez le même objet mais utilisez des valeurs à la place,

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

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

Vous obtiendrez le tableau suivant:

[ 'somestring', 42, false ]

Donc, si vous souhaitez accéder au object1.b, mais en utilisant un index à la place, vous pouvez utiliser:

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

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

Arthur Senna
la source
1
Cette méthode dans le cadre du suggéré dans ce sujet semble être la plus courte et la plus élégante.
Petro Franko
5
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)

Éditer:

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

En fait, 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.

cuzzea
la source
Je sais que vous pouvez y accéder par la clé, ce n'est pas ce que je demandais.
daryl
@Brogrammer: votre question est ambiguë, donc cet article répond potentiellement à la question telle qu'elle est écrite.
sortie
2

par jquery vous pouvez faire ceci:

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

Récupérez le tableau de clés, inversez-le, puis exécutez 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
  }
Kareem
la source
1

vous pouvez créer un tableau rempli de vos champs d'objet et utiliser un index sur le tableau et accéder aux propriétés de l'objet via ce

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]
arfa
la source
1

Je suis allé de l'avant et j'ai créé une fonction pour vous:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

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

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"

StackGeek
la source
1
Pouvez-vous expliquer ce qui se fait dans votre démarche?
Rahul Bhobe le
J'ai ajouté quelques commentaires dans le code pour que vous puissiez comprendre ce qui se fait.
StackGeek
0

Si vous n'êtes pas sûr qu'Object.keys () va vous renvoyer les clés dans le bon ordre, vous pouvez essayer cette logique à la place

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]])
Thiago Loddi
la source