486 Stimmen

JavaScript-Objekt: Zugriff auf variable Eigenschaft nach Name als String

Wenn ich ein Javascript-Objekt habe, das wie unten aussieht

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

und ich habe eine Funktion, die sowohl das Objekt als auch einen Eigenschaftsnamen wie folgt übergeben wird

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

was würde der Körper von read_prop(object, property) aussehen?

930voto

ThiefMaster Punkte 297146

Sie brauchen dafür keine Funktion - verwenden Sie einfach die Klammerschreibweise :

var side = columns['right'];

Dies ist gleichbedeutend mit Punktnotation , var side = columns.right; mit Ausnahme der Tatsache, dass right kann auch von einer Variablen, einem Funktionsrückgabewert usw. stammen, wenn die Klammerschreibweise verwendet wird.

Wenn Sie eine Funktion dafür brauchen, hier ist sie:

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

Um einige der unten stehenden Kommentare zu beantworten, die nicht direkt mit der ursprünglichen Frage zusammenhängen, können verschachtelte Objekte durch mehrere Klammern referenziert werden. Wenn Sie ein verschachteltes Objekt wie dieses haben:

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

können Sie auf Eigentum zugreifen x de c wie folgt:

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

Wenn eine Eigenschaft undefiniert ist, gibt der Versuch, auf sie zu verweisen, Folgendes zurück undefined (nicht null o false ):

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

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

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

98voto

Prusprus Punkte 7878

Die Antwort von ThiefMaster ist zu 100 % richtig, obwohl ich auf ein ähnliches Problem gestoßen bin, bei dem ich eine Eigenschaft von einem verschachtelten Objekt (Objekt innerhalb eines Objekts) abrufen musste. Als Alternative zu seiner Antwort können Sie eine rekursive Lösung erstellen, die es Ihnen ermöglicht, eine Nomenklatur zu definieren, um eine beliebige Eigenschaft zu erfassen, unabhängig von der Tiefe:

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];
}

Wo Ihre Zeichenfolgenreferenz auf eine bestimmte Eigenschaft ähnelt property1.property2

Code und Kommentare in JsFiddle .

11voto

Junco Punkte 281

Da mir die obige Antwort bei meinem Projekt geholfen hat (ich hatte eine doppelte Frage gestellt und wurde hierher verwiesen), reiche ich eine Antwort (meinen Testcode) für die Klammerschreibweise bei der Verschachtelung innerhalb der 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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X