975 votes

Accès à une propriété d'objet dont le nom est calculé dynamiquement

J'essaie d'accéder à une propriété d'un objet en utilisant un nom dynamique. Est-ce possible ?

const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"

1293voto

Jan Hančič Points 19496

Il y a deux façons d'accéder aux propriétés d'un objet :

  • Notation en points : something.bar
  • Notation des crochets : something['bar']

La valeur entre les crochets peut être n'importe quelle expression. Par conséquent, si le nom de la propriété est stocké dans une variable, vous devez utiliser la notation entre crochets :

var something = {
  bar: 'foo'
};
var foo = 'bar';

// both x = something[foo] and something[foo] = x work as expected
console.log(something[foo]);
console.log(something.bar)

47 votes

Attention : les compilateurs javascript vont faire une erreur ici car ils ne renomment pas les chaînes mais ils renomment les propriétés des objets

9 votes

Plus d'informations sur les raisons de ce phénomène : Les objets JS sont des tableaux associatifs, voilà pourquoi. Pour en savoir plus : quirksmode.org/js/associative.html stackoverflow.com/questions/14031368/

2 votes

@dotnetguy Non, ils ne le sont pas. Les tableaux sont des objets qui héritent du prototype d'objet JS ordinaire et vous pouvez donc ajouter des propriétés comme n'importe quel objet ordinaire. Le comportement "associatif" est plus proche de l'objet que du tableau. Vous ne pouvez pas itérer la version "associative" par simple index, elle n'affiche donc pas un comportement similaire à celui d'un tableau. Vous pouvez définir votre tableau "associatif" comme {} ou [] et le traiter de la même manière dans les deux cas en ce qui concerne l'accès aléatoire aux propriétés.

196voto

abahet Points 2631

Voici ma solution :

function resolve(path, obj) {
    return path.split('.').reduce(function(prev, curr) {
        return prev ? prev[curr] : null
    }, obj || self)
}

Exemples d'utilisation :

resolve("document.body.style.width")
// or
resolve("style.width", document.body)
// or even use array indexes
// (someObject has been defined in the question)
resolve("part.0.size", someObject) 
// returns null when intermediate properties are not defined:
resolve('properties.that.do.not.exist', {hello:'world'})

65voto

Sonique Points 173

En javascript, nous pouvons y accéder avec :

  • notation par points - foo.bar
  • crochets - foo[someVar] o foo["string"]

Mais seul le deuxième cas permet d'accéder aux propriétés de manière dynamique :

var foo = { pName1 : 1, pName2 : [1, {foo : bar }, 3] , ...}

var name = "pName"
var num  = 1;

foo[name + num]; // 1

// -- 

var a = 2;
var b = 1;
var c = "foo";

foo[name + a][b][c]; // bar

13 votes

Je suis confronté à 2 000 lignes d'instructions if parce que le développeur précédent n'utilisait pas de crochets et accédait statiquement aux propriétés des objets en utilisant la notation par points. C'est pour une application de processus d'approbation qui a 7 approbateurs différents et les étapes sont toutes les mêmes. /rip

43voto

zloctb Points 531

Voici un exemple ES6 de la façon dont vous pouvez accéder à la propriété d'un objet en utilisant un nom de propriété qui a été généré dynamiquement en concaténant deux chaînes de caractères.

var suffix = " name";

var person = {
    ["first" + suffix]: "Nicholas",
    ["last" + suffix]: "Zakas"
};

console.log(person["first name"]);      // "Nicholas"
console.log(person["last name"]);       // "Zakas"

C'est ce qu'on appelle noms de propriétés calculés

27voto

Gorka Hernandez Points 2327

Vous pouvez y parvenir de différentes manières.

let foo = {
    bar: 'Hello World'
};

foo.bar;
foo['bar'];

La notation entre crochets est particulièrement puissante car elle vous permet d'accéder à une propriété sur la base d'une variable :

let foo = {
    bar: 'Hello World'
};

let prop = 'bar';

foo[prop];

Cette méthode peut être étendue à l'examen en boucle de toutes les propriétés d'un objet. Cela peut sembler redondant en raison des nouvelles constructions JavaScript telles que for ... of ..., mais permet d'illustrer un cas d'utilisation :

let foo = {
    bar: 'Hello World',
    baz: 'How are you doing?',
    last: 'Quite alright'
};

for (let prop in foo.getOwnPropertyNames()) {
    console.log(foo[prop]);
}

La notation par points et par crochets fonctionne également comme prévu pour les objets imbriqués :

let foo = {
    bar: {
        baz: 'Hello World'
    }
};

foo.bar.baz;
foo['bar']['baz'];
foo.bar['baz'];
foo['bar'].baz;

Déstructuration d'objets

Nous pourrions également considérer la déstructuration d'objets comme un moyen d'accéder à une propriété d'un objet, mais de la manière suivante :

let foo = {
    bar: 'Hello World',
    baz: 'How are you doing?',
    last: 'Quite alright'
};

let prop = 'last';
let { bar, baz, [prop]: customName } = foo;

// bar = 'Hello World'
// baz = 'How are you doing?'
// customName = 'Quite alright'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X