2009-05-28 8 views
33

El código:El uso de variables claves para acceder a los valores en JavaScript objetos

function updateDashboardData() { 
    $.getJSON("includes/system/ajaxDataInterface.php", {recordcount:1}, function(data) { 
     $('.stationContainer').each(function(data) { 
      var bsID = $(this).attr("id"); 
      var bsStatus = $(this).children('.stationStatus'); 
      alert(data[bsID][0].time); 
      bsStatus.find('.bs_maxHandsets').text(data[bsID][0].maxHandsets); 
      bsStatus.find('.bs_time').text(data[bsID][0].time); 
     }); 
    }); 
} 

Los datos del objeto:

{ 
    "A5A50000": [{ 
     "bsid": "A5A50000", 
     "chanCount": 17, 
     "time": "2009-05-27 16:36:45", 
     "avgInterference": 1.711765, 
     "maxInterference": 4.97, 
     "avgHandsets": 205.1176, 
     "maxHandsets": 315, 
     "avgCalls": 6.4118, 
     "maxCalls": 13, 
     "avgCBA": 3868.98059, 
     "maxCBA": 7463, 
     "sumSuccessCBA": 197318, 
     "sumTimeoutHandoff": 133, 
     "sumAttemptHandoff": 1028, 
     "sumDeniedHandoff": 216, 
     "sumConfirmHandoff": 679, 
     "sumHandoffNetwork": 61873, 
     "sumJoinNetwork": 96888, 
     "sumLeaveNetwork": 93754, 
     "sumRcvdKeepalive": 98773, 
     "sumTimeoutKeepalive": 19748, 
     "sumAttemptUplink": 93689, 
     "sumBlockedUplink": 62453 
    }] 
} 

El problema:

alert(data.A5A50000[0].time); muestra correctamente "2009-05-27 16 : 36: 45 ".

alert(bsID); muestra correctamente "A5A50000".

alert(data.bsID[0].time); informes "data.bsID no está definido".

alert(data[bsID][0].time); informes "data [bsID] no está definido".

No estoy muy claro cuando una variable no se evalúa. Tal vez estoy pasando por alto algo tonto, pero no puedo resolver mi problema aquí.

+0

Uhm, yo estoy probando demasiado y funciona para mí .. –

+0

¿Qué sucede si alerta (bsID)? ¿está definido? –

+1

alert (bsID) informa "A5A50000". Actualizada la función original UpdateDashboardData() arriba. Cuando inicio la función desde la consola mediante updateDashboardData(); Me saludan con: "datos [bsID] no está definido http://192.168.2.236/michaelg/js/xmonitor.js Línea 21". La línea 21 es la alerta(). ¿Hay algo funcionalmente diferente entre el código inicial y cómo lo estoy aplicando aquí, lo que podría estar afectando el resultado? – mikegreenberg

Respuesta

88

Puede acceder a las propiedades del objeto por notación de puntos o por notación de corchetes.

var x = {'test': 'hi'}; 
alert(x.test); // alerts hi 
alert(x['test']); // alerts hi 

Cuando usted tiene un valor dinámico, usted tiene que utilizar este último:

var property = 'test'; 
alert(x.property); // looks for x.property, undefined if it doesn't exist 
alert(x[property]); // looks for x['test'], alerts hi 

Así que lo que realmente quiere decir:

alert(data[bsID][0].time); 

EDITAR:

No estoy seguro de lo que estás haciendo mal, pero esto está funcionando para mí en Firebug's co nsole:

var data = {"A5A50000":[{"bsid":"A5A50000","chanCount":17,"time":"2009-05-27 16:36:45","avgInterference":1.711765,"maxInterference":4.97,"avgHandsets":205.1176,"maxHandsets":315,"avgCalls":6.4118,"maxCalls":13,"avgCBA":3868.98059,"maxCBA":7463,"sumSuccessCBA":197318,"sumTimeoutHandoff":133,"sumAttemptHandoff":1028,"sumDeniedHandoff":216,"sumConfirmHandoff":679,"sumHandoffNetwork":61873,"sumJoinNetwork":96888,"sumLeaveNetwork":93754,"sumRcvdKeepalive":98773,"sumTimeoutKeepalive":19748,"sumAttemptUplink":93689,"sumBlockedUplink":62453}]}; 
var bsID = 'A5A50000'; 
alert(data[bsID][0].time); 
+0

Después de intentar su sugerencia, alerta (data [bsID] [0] .time); informa que "data [bsID] no está definido". He actualizado el código con el que estoy probando más arriba. Estoy probando esto dentro de la consola de Firebug (en FF, obviamente). – mikegreenberg

+0

Probé su código de prueba y también funcionó bien para mí.Mirando el código anterior, lo único que puedo imaginar que sale mal es que el bsID no es lo que se esperaba. Probando el tipo de bsID, informa "cadena". Más sugerencias de prueba un problema con los datos devueltos de getJSON(). Cuando intento acceder a los datos [bsID] [0], donde los datos provienen de getJSON, informan sin definir. Si defino explícitamente los datos como el objeto que publiqué en la pregunta original, funciona. Necesito jugar con los datos devueltos para ver qué pasa. – mikegreenberg

3

En Javascript, puede utilizar cualquier objeto o una notación de tipo de matriz para buscar un atributo. Los siguientes son equivalentes:

data.A5A50000 
data['A5A50000'] 

Con la segunda sintaxis, se puede utilizar una variable en lugar de una cadena de objetos:

data[bsID][0] 
+0

data [bsID [0]] no es lo que quiere. Son datos [bsID] [0] –

Cuestiones relacionadas