Acceder a las propiedades del objeto con índice da indefinido

A continuación se muestra una función que contiene un objeto, y quiero poder acceder a un cuerpo específico dentro del objeto con el uso de un argumento, es decir, con un índice.

El problema es que cuando trato de acceder a una propiedad de esta manera obtengo

indefinido

cuando la consola lo registra. ¿Qué estoy haciendo mal?

moveLeftBtn.on('click', function(nr){ var theBody = { bodies: { a: 'foo1', b: 'foo2', c: 'foo3' } }; var newBody = theBody.bodies[1]; // temporarily hardcoded value instead of argument console.log(newBody); // <-- undefined, why? return newBody; }); 

EDITAR

Si consuelo el registro theBody.bodies puedo ver su valor ( Object {a: Array[5], b: Array[5], c: Array[5]} ), pero cuando bash acceder a sus propiedades con [1] yo obtengo

indefinido

(aunque las propiedades contengan cadenas).

El único problema que veo con tu código es que no estás devolviendo nada. Cambio . . .

 var newBody = theBody.bodies[nr]; 

. . . a . . .

 return theBody.bodies[nr]; 

. . . y usted debe ser bueno para ir

Edit: Oh, también te estás perdiendo el ; después de definir theBody .

theBody.bodies es un objeto con tres propiedades llamadas a , b y c . Usted no le dio ninguna propiedad llamada 1 . Es por eso que el valor de theBody.bodies[1] undefined está undefined . Si hace referencia a theBody.bodies['b'] , encontrará una de las propiedades que espera, con un valor de 'foo1' .

Parece que solo necesitas leer sobre los arrays y objetos de JavaScript y cómo funcionan. No haga suposiciones basadas en cosas como “matrices asociativas” que puede haber usado en otros idiomas. JavaScript es un lenguaje propio con sus propias formas de hacer las cosas, así que solo necesitas aprenderlas.

theBody.bodies no es una matriz sino un objeto plano. Normalmente, no se puede acceder a los campos de objetos planos con índices numéricos.

Pero puedes theBody.bodies definiendo el objeto theBody.bodies así:

 var theBody = { bodies: { '0': 'foo1', '1': 'foo2', '2': 'foo3' } } 

Con los bodies definidos de esta manera habrá theBody.bodies[1] === 'foo2' .

Si, por cualquier motivo, no puede cambiar los bodies , puede procesarlos y crear otro objeto a qué campos puede acceder con un índice numérico, como por ejemplo:

 var newBodies = [], i = 0, j; for (j in theBody.bodies) { newBodies.push(theBody.bodies[j]); } 

En caso de que theBody.bodies en un objeto no siempre sencillo (por ejemplo, de algún tipo) que en lugar de for bucle, se deba $.each con $.each o for bucle se amplíe con la comprobación de hasOwnProperty .

La indexación funciona muy bien en Firefox, pero no conozco otros navegadores. Tendrá que agregar más lógica para la comprobación de índice. De todos modos, no debe acceder a los objetos mediante un índice, ya que el orden de las propiedades puede cambiar y debe tratarlos como un mapa o un conjunto en lugar de una lista indexada.

getByIndex() una función getByIndex() en todos los objetos para este ejemplo. Puedes crear tu propio objeto y adjuntarle la función.

Aquí hay un JSFiddle que hice que funciona para lo que necesitas que haga: http://jsfiddle.net/zKrbr/4/

 Object.prototype.getByIndex = function (property, index) { var n = 0; if (this.hasOwnProperty(property)) { for (var prop in this[property]) { if (n == index) { console.log('Found Match: '+prop+': '+this[property][prop]); return this[property][prop]; } else { n++; } } } return undefined; } $('#moveLeft').on('click', function (nr) { var theBody = { bodies: { a: 'foo1', b: 'foo2', c: 'foo3' } }; var index = parseInt($('#input').val()); var currIndex = !isNaN(index) ? index : 0; var newBody = theBody.getByIndex('bodies', currIndex); $('#output').val(newBody); }); 
 Index: