2017-07-24 7 views
0

Ich habe den folgenden Code, der funktioniert, aber es scheint übergewichtig für den Zweck. Gibt es einen kürzeren Weg, um das Ziel zu erreichen, verschachtelte JSONs zu durchlaufen?Verfeinern von node.js Code zum Durchlaufen von json verschachtelten Objekten

ich dies auf Lambda leite und Laden der json von s3

myFile.json

{ 
    "jsonIsOk": 
    [ 
    { 
     "txt_in": "aaa", 
     "txt_out": "111" 
    }, 
    { 
     "txt_in": "bbb", 
     "txt_out": "222" 
    }, 
    { 
     "txt_in": "ccc", 
     "txt_out": "333" 
    } 
    ] 
    } 

Lambda node.js

var isJsnOk = "jsonIsOk"; 

var s3 = new AWS.S3({httpOptions: { timeout: 2000 }}); 
var params = { 
    Bucket: 'myBucket', 
    Key: 'myFile.json', 
}; 

s3.getObject(params, function (err, data) { 
    if (err) { 
     console.log(err, err.stack); 
    } else { 
     var loadJson = data.Body.toString(); 
     var jsnAry = JSON.parse(loadJson); 
     if (jsnAry.hasOwnProperty(isJsnOk)) { 
      for (var key_01 in jsnAry) { 
       if (jsnAry.hasOwnProperty(key_01)) { 
        for (var key_02 in jsnAry[key_01]) { 
         console.log('key_02=' + key_02); 
         if (jsnAry[key_01].hasOwnProperty(key_02)) { 
          for (var key_03 in jsnAry[key_01][key_02]) { 
           console.log('key_03=' + key_03 + ': val_03 =' + jsnAry[key_01][key_02][key_03]); 
          } 
         } 
         console.log("-------"); 
        } 
       } 
      } 
     } else { 
      console.log("error: json is not ok!"); 
     } 
    } 
} 

Ausgang

key_02=0 
key_03=txt_in: val_03 =aaa 
key_03=txt_out: val_03 =111 
------- 
key_02=1 
key_03=txt_in: val_03 =bbb 
key_03=txt_out: val_03 =222 
------- 
key_02=2 
key_03=txt_in: val_03 =ccc 
key_03=txt_out: val_03 =333 
------- 
+0

Welche info sollte * key_02 * liefern ?? Kannst du es einfach weglassen? –

Antwort

0

Es gibt eine einige Prototypen auf Array, mit denen Sie diese verschachtelte Schleife funktional schreiben und Ihre gesamten Codezeilen reduzieren können (auch einfacher imo zu lesen). Dies wird nicht die Ausgabe in Ihrem Beispiel wortwörtlich erzeugen, da ich nicht wirklich sicher bin, was die Bedeutung des Schlüsselwertes ist (es gibt keine Schlüssel, es ist ein Array, es hat Indizes), aber hoffentlich gibt es Ihnen ein paar Ideen wie Sie könnte besser den Code schreiben, die

{ 
    "jsonIsOk": 
    [ 
    { 
     "txt_in": "aaa", 
     "txt_out": "111" 
    }, 
    { 
     "txt_in": "bbb", 
     "txt_out": "222" 
    }, 
    { 
     "txt_in": "ccc", 
     "txt_out": "333" 
    } 
    ] 
    } 

obj.jsonIsOk.forEach(a => console.log("txt_in: " + a.txt_in + " txt_out: " + a.txt_out)); 

// prints 
txt_in: aaa txt_out: 111 
txt_in: bbb txt_out: 222 
txt_in: ccc txt_out: 333 

Sie können auch feststellen, die map Prototyp nützlich darüber iteriert, es funktioniert ähnlich wie dies außer es eine neue Kollektion gibt, die die Ergebnisse enthält von der Funktion zurück an Sie weitergeben es (ich benutze Lambda-Syntax hier, könnten Sie einfach Vanille js, um eine anonyme Funktion übergeben).

0

Sie grundsätzlich Schleife dreimal mit dem gleichen Code, der leicht rekursiv durchgeführt werden können:

function iterate(obj,i=1){ 
    Object.keys(obj).forEach(function(key){ 
    console.log(" ".repeat(i-1)+"key_0"+i+"="+key); 
    if(typeof obj[key] === "object"){ 
     iterate(obj[key],i+1); 
    }else{ 
     console.log(" ".repeat(i-1)+"value0"+i+"="+obj[key]); 
    } 
}); 
} 

Und dann wie folgt beginnen:

iterate(obj.jsonIsOk); 

http://jsbin.com/zedoluwega/edit?console

Ive fügte auch einige Räume, um die Struktur klarer zu machen ...

Verwandte Themen