2010-11-23 10 views
274

Si tengo un objeto JavaScript que se parece a continuaciónobjeto de JavaScript: el acceso de propiedad variable por su nombre como cadena

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

y tengo una función que se pasa tanto el objeto, y un nombre de propiedad como tal

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

¿cómo sería el cuerpo de read_prop(object, property)?

+14

duplicado, pero al parecer esta es una "mejor" pregunta (más votos tanto en la pregunta como en la respuesta) que el original, ciertamente encontré esto a través de Google, en lugar de la pregunta "original" – BlackTigerX

+0

@BlackTigerX cómo las tablas tienen convertido –

+1

@PatrickRoberts oh sí, probablemente teniendo el enlace de esto a la otra pregunta ha ayudado, todavía veo el beneficio de tener el título ligeramente diferente en la pregunta (propiedad por nombre como cadena) – BlackTigerX

Respuesta

517

Usted no necesita una función para la que - simplemente usar el bracket notation:

var side = columns['right']; 

Esto es igual a dot notation, var side = columns.right;, excepto el hecho de que right también podría provenir de un valor de retorno variable, función, etc., al usar la notación de corchetes.

Si se necesita una función para ello, aquí está:

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

Tal vez esto es evidente, pero yo Creo que valdría la pena indicar explícitamente que 'prop' debe ser de tipo' string' y o resolver escribir 'string'. – prasanthv

+1

en mi humilde opinión que es bastante obvio ... – ThiefMaster

+7

y ¿qué pasa con los objetos anidados? – sarkiroka

5

Desde Me ayudaron con mi proyecto de la respuesta anterior (he hecho una pregunta duplicado y fue referido aquí), que estoy presentando una responder (mi código de prueba) para la notación de corchetes cuando se anidan dentro de 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>

55

respuesta de ThiefMaster es 100% correcto (upvoted!), Aunque me encontré con un problema similar donde necesitaba obtener una propiedad de un objeto anidado (objeto dentro de un objeto), así que como alternativa a su respuesta, puede crear una solución recursiva que permita que defina una nomenclatura para grabar cualquier propiedad, independientemente de la profundidad:

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

Donde su cadena de referencia a una propiedad dada ressembles property1.property2

código y los comentarios en JsFiddle.

+1

esto no funcionará si la cadena 'prop' contendrá los índices de matriz – SET

+3

Tal como esto? http: // jsfiddle.net/amofb8xa/8/ – Prusprus

+2

Esto es realmente algo muy poderoso en ciertos casos en Angular, especialmente cuando se trabaja con sintaxis 'controllerAs' - porque' controllerAs' significa realmente, "Crea una propiedad en' $ scope' con cualquier alias que hayas definido ', puede que tenga que rastrear el alcance para obtener una propiedad anidada. –

Cuestiones relacionadas