web-dev-qa-db-fra.com

Utilisation de clés variables pour accéder aux valeurs des objets JavaScript

Le code:

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

Les données d'objet:

{
    "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
    }]
}

Le problème:

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

alert(bsID); affiche correctement "A5A50000".

alert(data.bsID[0].time); signale que "data.bsID n'est pas défini".

alert(data[bsID][0].time); signale "les données [bsID] ne sont pas définies".

Je ne sais pas trop quand une variable est/n'est pas évaluée. Peut-être que je néglige quelque chose de stupide, mais je ne peux pas comprendre mon problème ici.

46
mikegreenberg

Vous pouvez accéder aux propriétés des objets par notation par points ou par notation entre crochets.

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

Lorsque vous avez une valeur dynamique, vous devez utiliser cette dernière:

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

Donc ce que vous voulez vraiment, c'est:

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

MODIFIER :

Je ne sais pas ce que vous faites mal, mais cela fonctionne pour moi sur la console de Firebug:

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);
131
Paolo Bergantino

En Javascript, vous pouvez utiliser une notation de type objet ou tableau pour rechercher un attribut. Les éléments suivants sont équivalents:

data.A5A50000
data['A5A50000']

Avec la deuxième syntaxe, vous pouvez utiliser une variable à la place d'une chaîne d'objet:

data[bsID][0]
3
Daniel Roseman