62 votes

Boucler à travers JSON avec node.js

J'ai un fichier JSON sur lequel j'ai besoin d'itérer, comme le montre ci-dessous...

{
    "device_id": "8020",
    "data": [{
        "Timestamp": "04-29-11 05:22:39 pm",
        "Start_Value":  0.02,
        "Abstract": 18.60,
        "Editor": 65.20
    }, {
        "Timestamp": "04-29-11 04:22:39 pm",
        "End_Value":  22.22,
        "Text": 8.65,
        "Common": 1.10,
        "Editable": "true",
        "Insert": 6.0
    }]
}

Les clés dans les données ne seront pas toujours les mêmes (j'ai juste utilisé des exemples, il y a 20 clés différentes), et donc, je ne peux pas configurer mon script pour les référencer statiquement pour obtenir les valeurs.

Autrement, je pourrais indiquer

var value1 = json.data.Timestamp;
var value2 = json.data.Start_Value;
var value3 = json.data.Abstract;
etc

Dans le passé, j'ai utilisé une simple boucle foreach sur le nœud de données...

foreach ($json->data as $key => $val) {
    switch($key) {
        case 'Timestamp':
            //faire ceci;
        case: 'Start_Value':
            //faire cela
    }
}

Mais je ne veux pas bloquer le script. Des idées?

104voto

Van Coding Points 5816

Vous pouvez itérer à travers les objets JavaScript de cette manière :

for(var attributename in myobject){
    console.log(attributename+": "+myobject[attributename]);
}

myobject pourrait être votre json.data

26voto

Nathan Sweet Points 392

Je recommanderais de profiter du fait que nodeJS sera toujours en ES5. Rappelez-vous que ce n'est pas pour les navigateurs, vous pouvez compter sur la stabilité de l'implémentation du langage. Cela dit, je déconseillerais d'utiliser une boucle for-in dans nodeJS, à moins que vous ne vouliez vraiment faire une récursion profonde dans la chaîne de prototypes. Pour une boucle simple et traditionnelle, je recommanderais d'utiliser la méthode Object.keys en ES5. Si vous regardez le test JSPerf suivant, en particulier si vous utilisez Chrome (car il a le même moteur que nodeJS), vous aurez une idée approximative de la performance supérieure de l'utilisation de cette méthode par rapport à une boucle for-in (environ 10 fois plus rapide). Voici un exemple de code :

 var keys = Object.keys( obj );
 for( var i = 0,length = keys.length; i < length; i++ ) {
     obj[ keys[ i ] ];
 }

24voto

mak Points 5715

Vous voudrez peut-être aussi utiliser hasOwnProperty dans la boucle.

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        switch (prop) {
            // obj[prop] a la valeur
        }
    }
}

node.js est single-threaded, ce qui signifie que votre script sera bloqué que vous le vouliez ou non. Rappelez-vous que V8 (le moteur Javascript de Google que node.js utilise) compile le Javascript en code machine, ce qui signifie que la plupart des opérations de base sont très rapides et parcourir un objet avec 100 clés prendrait probablement quelques nanosecondes ?

Cependant, si vous faites beaucoup de choses à l'intérieur de la boucle et que vous ne voulez pas qu'elle bloque maintenant, vous pourriez faire quelque chose comme ceci

switch (prop) {
    case 'Timestamp':
        setTimeout(function() { ... }, 5);
        break;
    case 'Start_Value':
        setTimeout(function() { ... }, 10);
        break;
}

Si votre boucle effectue un travail très intensif en CPU, vous devrez créer un processus enfant pour effectuer ce travail ou utiliser des web workers.

6voto

Mike Scott Points 2763

Si vous voulez éviter le blocage, ce qui n'est nécessaire que pour de très grandes boucles, enveloppez le contenu de votre boucle dans une fonction appelée comme ceci : process.nextTick(function(){}), ce qui retardera l’exécution jusqu’au prochain tick, offrant ainsi une opportunité de traiter les appels en attente provenant d’autres fonctions asynchrones.

6voto

Tharanga Points 416

Ma façon préférée est,

var objectKeysArray = Object.keys(yourJsonObj)
objectKeysArray.forEach(function(objKey) {
    var objValue = yourJsonObj[objKey]
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X