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?

4voto

Nish Points 567

Si nous utilisons nodeJS, nous devrions certainement profiter des différentes bibliothèques qu'il fournit. Les fonctions intégrées telles que each(), map(), reduce() et bien d'autres de underscoreJS réduisent nos efforts. Voici un exemple

    var _=require("underscore");
    var fs=require("fs");

    var jsonObject=JSON.parse(fs.readFileSync('YourJson.json', 'utf8'));

    _.map( jsonObject, function(content) {
        _.map(content,function(data){
           if(data.Timestamp)
              console.log(data.Timestamp)          
           })
      })

3voto

Asad Choudhary Points 113

Un peu en retard mais je crois qu'une clarification supplémentaire est donnée ci-dessous.

Vous pouvez itérer à travers un tableau JSON avec une simple boucle, comme:

for(var i = 0; i < jsonArray.length; i++)
{
    console.log(jsonArray[i].nomattribut);
}

Si vous avez un objet JSON et que vous souhaitez itérer à travers tous ses objets internes, alors vous devez d'abord obtenir toutes les clés dans un tableau et itérer à travers les clés pour récupérer les objets en utilisant les noms de clé, comme:

var keys = Object.keys(jsonObject);
for(var i = 0; i < keys.length; i++) 
{
    var key = keys[i];
    console.log(jsonObject.key.nomattribut);
}

2voto

JWally Points 102

Je ne suis pas sûr que cela aide, mais il semble qu'il pourrait y avoir une bibliothèque pour l'itération asynchrone dans node hébergée ici :

https://github.com/caolan/async

Async est un module utilitaire qui fournit des fonctions simples et puissantes pour travailler avec du JavaScript asynchrone. Bien qu'initialement conçu pour être utilisé avec node.js, il peut également être utilisé directement dans le navigateur.

Async propose une vingtaine de fonctions incluant les suspects 'fonctionnels' habituels (map, reduce, filter, forEach...) ainsi que quelques modèles courants pour le flux de contrôle asynchrone (parallèle, série, waterfall...). Toutes ces fonctions supposent que vous suivez la convention de node.js en fournissant un seul rappel en tant que dernier argument de votre fonction asynchrone.

1voto

AlexGad Points 2958

Jetez un œil à Traverse. Il parcourra récursivement un arbre d'objets pour vous et à chaque nœud, vous avez accès à différents objets - clé du nœud actuel, valeur du nœud actuel, parent du nœud actuel, chemin complet de la clé du nœud actuel, etc. https://github.com/substack/js-traverse. Je l'ai utilisé avec succès sur des objets pour lesquels je voulais supprimer les références circulaires et lorsque j'avais besoin de faire un clone en profondeur tout en transformant divers éléments de données. Voici un code tiré de leurs exemples pour vous donner une idée de ce qu'il peut faire.

var id = 54;
var callbacks = {};
var obj = { moo : function () {}, foo : [2,3,4, function () {}] };

var scrubbed = traverse(obj).map(function (x) {
    if (typeof x === 'function') {
        callbacks[id] = { id : id, f : x, path : this.path };
        this.update('[Fonction]');
        id++;
    }
});

console.dir(scrubbed);
console.dir(callbacks);

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