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!"
687
RichW 22 nov. 2010 à 14:23

6 réponses

const something = { bar: "Foobar!" };
const foo = 'bar';

something[\`${foo}\`];
-3
Cody Gray 19 sept. 2017 à 17:12

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é basée sur une variable:

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

let prop = 'bar';

foo[prop];

Cela peut être étendu au bouclage sur chaque propriété d'un objet. Cela peut sembler redondant en raison de nouvelles constructions JavaScript telles que pour ... de ..., mais aide à 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'objet comme un moyen d'accéder à une propriété dans un objet, mais comme suit:

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'
15
Gorka Hernandez 13 déc. 2017 à 08:06

Vous pouvez le faire comme ceci en utilisant Lodash get

_.get(object, 'a[0].b.c');
8
JJJ 6 sept. 2018 à 15:57

En javascript, nous pouvons accéder avec:

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

Mais seul le deuxième cas permet d'accéder dynamiquement aux propriétés:

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
33
Sonique 1 juil. 2014 à 15:40

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'})
78
GeekyDeaks 23 sept. 2017 à 14:45

Il y a quelques possibilités:

const test = {
    prop1: {
      prop2: {
        prop3: "I'm very nested"
      }
    }

const test1 = test.prop1.prop2.prop3
const test2 = test['prop1']['prop2']['prop3']
const test3 = test['prop1.prop2.prop3'] //will return undefined
const test4 = _.get(test, 'prop1.prop2.prop3') //use lodash

Si vous souhaitez obtenir une valeur imbriquée dynamiquement (par exemple par variable), votre meilleure option sera d'utiliser lodash.

-1
BartusZak 4 oct. 2019 à 14:49