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!"

3voto

Jackson Points 6654

D'autres ont déjà mentionné les syntaxes "point" et "carré", je souhaite donc couvrir l'accès aux fonctions et l'envoi de paramètres d'une manière similaire.

Code jsfiddle

var obj = {method:function(p1,p2,p3){console.log("method:",arguments)}}

var str = "method('p1', 'p2', 'p3');"

var match = str.match(/^\s*(\S+)\((.*)\);\s*$/);

var func = match[1]
var parameters = match[2].split(',');
for(var i = 0; i < parameters.length; ++i) {
  // clean up param begninning
    parameters[i] = parameters[i].replace(/^\s*['"]?/,'');
  // clean up param end
  parameters[i] = parameters[i].replace(/['"]?\s*$/,'');
}

obj[func](parameters); // sends parameters as array
obj[func].apply(this, parameters); // sends parameters as individual values

3voto

ES5 // Vérifier les variables profondément imbriquées

Ce simple morceau de code peut vérifier l'existence de variables/valeurs profondément imbriquées sans avoir à vérifier chaque variable en cours de route...

var getValue = function( s, context ){
    return Function.call( context || null, 'return ' + s )();
}

Ex. - un tableau d'objets profondément imbriqués :

a = [ 
    {
      b : [
          {
             a : 1,
             b : [
                 {
                    c : 1,
                    d : 2   // we want to check for this
                 }
             ]
           }
      ]
    } 
]

Au lieu de :

if(a && a[0] && a[0].b && a[0].b[0] && a[0].b[0].b && a[0].b[0].b[0] && a[0].b[0].b[0].d && a[0].b[0].b[0].d == 2 )  // true

Nous pouvons maintenant :

if( getValue('a[0].b[0].b[0].d') == 2 ) // true

Santé !

3voto

MD SHAYON Points 93
const objA = {
    key1: "value 1",
    key2: "value 2",
}

//objA.key1
//objA[‘key1’]
//const s = “key1”; 

console.log(objA['key1']);

Nous pouvons créer des propriétés en Javascript en définissant des variables dans un objet littéral. Nous pouvons accéder aux propriétés de notre objet de plusieurs façons, comme par exemple :

en savoir plus

2voto

Jocefyneroot Points 124

Démo objet exemple

let obj = {
    name: {
        first_name: "Bugs",
        last_name: "Founder",
        role: "Programmer"
    }
}

clé en forme de chaîne de points permettant d'obtenir la valeur de

let key = "name.first_name"

Fonction

const getValueByDottedKeys = (obj, strKey)=>{
    let keys = strKey.split(".")
    let value = obj[keys[0]];   
    for(let i=1;i<keys.length;i++){
        value = value[keys[i]]
    }
    return value
}

Appel de la fonction getValueByDottedKeys

value = getValueByDottedKeys(obj, key)
console.log(value)

sortie

Bugs

const getValueByDottedKeys = (obj, strKey)=>{
    let keys = strKey.split(".")
    let value = obj[keys[0]];   
    for(let i=1;i<keys.length;i++){
        value = value[keys[i]]
    }
    return value
}

let obj = {
    name: {
        first_name: "Bugs",
        last_name: "Founder",
        role: "Programmer"
    }
}

let key = "name.first_name"

value = getValueByDottedKeys(obj, key)
console.log(value)

0voto

J'ai rencontré le même problème, mais le module lodash est limité dans la gestion des propriétés imbriquées. J'ai écrit une solution plus générale en suivant l'idée d'un analyseur descendant récursif. Cette solution est disponible dans la Gist suivante :

Déréférencement récursif d'objets de descente

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