472 votes

Objet JavaScript : accès à la propriété d'une variable par son nom en tant que chaîne de caractères

Si j'ai un objet javascript qui ressemble à ce qui suit

var columns = {
  left: true,
  center : false,
  right : false
}

et j'ai une fonction qui reçoit à la fois l'objet et le nom d'une propriété, comme suit

//should return false
var side = read_prop(columns, 'right');

quel serait le corps de read_prop(object, property) ressembler ?

904voto

ThiefMaster Points 135805

Vous n'avez pas besoin d'une fonction pour cela - utilisez simplement la fonction notation entre crochets :

var side = columns['right'];

Cette valeur est égale à notation par points , var side = columns.right; sauf le fait que right peut également provenir d'une variable, de la valeur de retour d'une fonction, etc., lorsqu'on utilise la notation entre crochets.

Si vous avez besoin d'une fonction pour cela, la voici :

function read_prop(obj, prop) {
    return obj[prop];
}

Pour répondre à certains des commentaires ci-dessous qui ne sont pas directement liés à la question initiale, les objets imbriqués peuvent être référencés par plusieurs parenthèses. Si vous avez un objet imbriqué comme ceci :

var foo = { a: 1, b: 2, c: {x: 999, y:998, z: 997}};

vous pouvez accéder aux biens x de c comme suit :

var cx = foo['c']['x']

Si une propriété n'est pas définie, la tentative de la référencer renverra le message suivant undefined (pas null o false ):

foo['c']['q'] === null
// returns false

foo['c']['q'] === false
// returns false

foo['c']['q'] === undefined
// returns true

19 votes

Peut-être que cela va sans dire, mais je pense que cela vaut la peine de le signaler explicitement. prop doit être de type string et ou résoudre pour taper string .

1 votes

IMHO c'est assez évident...

14 votes

Et qu'en est-il des objets imbriqués ?

97voto

Prusprus Points 1171

La réponse de ThiefMaster est 100% correcte, bien que j'ai rencontré un problème similaire où j'avais besoin de récupérer une propriété d'un objet imbriqué (objet dans un objet), donc comme alternative à sa réponse, vous pouvez créer une solution récursive qui vous permettra de définir une nomenclature pour récupérer n'importe quelle propriété, indépendamment de la profondeur :

function fetchFromObject(obj, prop) {

    if(typeof obj === 'undefined') {
        return false;
    }

    var _index = prop.indexOf('.')
    if(_index > -1) {
        return fetchFromObject(obj[prop.substring(0, _index)], prop.substr(_index + 1));
    }

    return obj[prop];
}

Où la référence à une propriété donnée ressemble à une chaîne de caractères. property1.property2

Code et commentaires dans JsFiddle .

2 votes

Cela ne fonctionnera pas si prop La chaîne de caractères contiendra les indices du tableau

3 votes

0 votes

L'accès aux propriétés imbriquées peut se faire de manière beaucoup plus simple, consultez le site suivant stackoverflow.com/questions/4244896/

11voto

rt.hawk Points 9

Puisque la réponse ci-dessus m'a aidé dans mon projet (j'ai posé une question en double et on m'a renvoyé ici), je soumets une réponse (mon code de test) pour la notation des crochets lors de l'imbrication dans la var :

<html>
<head>
  <script type="text/javascript">
    function displayFile(whatOption, whatColor) {
      var Test01 = {
        rectangle: {
          red: "RectangleRedFile",
          blue: "RectangleBlueFile"
        },
        square: {
          red: "SquareRedFile",
          blue: "SquareBlueFile"
        }
      };
      var filename = Test01[whatOption][whatColor];
      alert(filename);
    }
  </script>
</head>
<body>
  <p onclick="displayFile('rectangle', 'red')">[ Rec Red ]</p>
  <br/>
  <p onclick="displayFile('square', 'blue')">[ Sq Blue ]</p>
  <br/>
  <p onclick="displayFile('square', 'red')">[ Sq Red ]</p>
</body>
</html>

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